Windows批处理读取txt文件,过滤行并将其打印在另一个文件中

时间:2017-07-07 17:19:40

标签: windows batch-file filter

我基于Batch file to filter strings from text and replace... but in a single batch instead of multiple?,但我仍然无法理解如何做到这一点。

我有一个输入txt flatfile,数据存储在固定列中。我需要使用Windows批处理逐行读取此文件。在特定列中,如果值是特定值,我需要在输出文件中打印其行。输入文件没有标题,所以我不必担心它。

例如,假设它有3列:

AAAA 1111 jjjjj
BBBB 2222 kkkkk
CCCC 1111 llll

我需要过滤第2列为1111的行,因此新文件必须包含:

AAAA 1111 jjjjj
CCCC 1111 llll

进行此过滤并打印到输出文件的代码是什么?

1 个答案:

答案 0 :(得分:1)

只要您在第8列或更早的列上进行过滤,那么您只需要一个具有适当构造的正则表达式的FINDSTR命令。请注意,FINDSTR正则表达式支持非常有限且非标准。

以下是您问题中示例的解决方案 - 在第二列中匹配1111:

findstr /rc:"^[^ ][^ ]*  *1111 " input.txt >output.txt

以下是匹配第5栏中的1111

的样子
findstr /rc:"^[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *1111 " input.txt >output.txt

如果您尝试过滤第9列或更高版本列,这将失败的原因是因为FINDSTR限制为最多15个字符类([x])项。有关详细信息,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?

更强大的替代方法是使用我的JREPL.BAT regex utility。 JREPL是纯脚本(混合批处理/ JScript),可以在XP之后的任何Windows版本上运行 - 不需要第三方exe文件。

jrepl "^\S+\s+1111\s" "" /k 0 /f input.txt /o output.txt

如果你想匹配第25列而不是第2列中的1111,那么JREPL解决方案将如下所示:

jrepl "^(\S+\s+){24}1111\s" "" /k 0 /f input.txt /o output.txt

由于JREPL是批处理脚本,如果将命令放在另一个批处理脚本中,则需要使用CALL JREPL。