【问题标题】:grep multiple patterns single file argument list too longgrep 多个模式单个文件参数列表太长
【发布时间】:2015-10-07 09:51:40
【问题描述】:

我目前正在一个文件中搜索多个模式。该文件大小为 90GB,我正在搜索特定字段(从每行的 6-17 位开始)。我正在尝试获取包含任何特定数字列表的所有行。我当前使用的语法是:

grep '^.\{6\}0000000012345\|^.\{6\}0000000012543' somelargeFile.txt > outputFile.txt

这适用于少量模式。对于大量模式,我得到“参数列表太长”错误。

我尝试过的一种替代方法是分别搜索每个模式(在模式上使用 for 循环),但这需要多次遍历大型数据文件(57102722 行),效率不高。

根据我对“参数列表太长”错误的了解,它通常与 bash cmds 相关,而不是特定于 grep。是否有任何设置可用于解决此错误?或者,关于如何使用 awk 或 sed 或其他工具执行此操作的任何想法?

谢谢!

【问题讨论】:

  • 很奇怪,“参数列表太长”通常是指您提到的文件。旁注:说grep -E '^.{6}00000000(12345|12543)'怎么样?
  • 什么是“大量”模式?
  • 你可以看看这个问题:stackoverflow.com/questions/31479822/…

标签: regex bash awk sed grep


【解决方案1】:

尝试使用交替运算符。

grep '^.\{6\}0000000012\(345\|543\)'

【讨论】:

    【解决方案2】:

    您可以通过将模式放入文件中并使用-f 命令行选项grep 来避免该问题。

    最方便的方法是将每个替代项放在文件的单独行中:

    patterns.txt

    ^.\{6\}0000000012345
    ^.\{6\}0000000012543
    

    调用

    grep -f patterns.txt somelargeFile.txt > outputFile.txt
    

    【讨论】:

    • 使用 -f 选项确实可以解决这里的问题。我没有收到“参数列表太长”错误。但是,我确实对 -f 选项的使用有疑问。它是为patterns.txt中的任意数量的条目循环一次数据,还是为patterns.txt中的每个模式循环一次数据。
    • 它编译一个正则表达式,然后读取 input.file 一次。
    猜你喜欢
    • 2014-05-21
    • 2015-06-25
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2016-04-14
    相关资源
    最近更新 更多