我基于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
进行此过滤并打印到输出文件的代码是什么?
答案 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。