代码之家  ›  专栏  ›  技术社区  ›  Hikari

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

  •  0
  • Hikari  · 技术社区  · 7 年前

    我基于 Batch file to filter strings from text and replace... but in a single batch instead of multiple?

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

    AAAA 1111 jjjjj
    BBBB 2222 kkkkk
    CCCC 1111 llll
    

    1111 ,因此新文件必须具有:

    AAAA 1111 jjjjj
    CCCC 1111 llll
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   dbenham    7 年前

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

    以下是您问题中示例的解决方案-匹配第2列中的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。