使用一个单词列表在另一个列表中进行 grep

使用一个单词列表在另一个列表中进行 grep

我有一个包含 250 行的列表。我必须通过 Web 服务器运行所有这些行才能获得输出列表。但是,此列表返回的行比我感兴趣的要多得多。例如,我的list.txt是:

a.1
b.1
etc

那么输出是output.txt

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

是否可以使用 grep 命令在 output.txt 中搜索 list.txt 中的所有单词,然后生成“通缉”列表 wanted.txt?我需要 output.txt 中的整行。我是脚本新手,但我想要的是类似这样的内容

grep list.txt output.txt > wanted.txt

我找不到这样的例子

答案1

我会忽略grep这一点。它对正则表达式很有用,但看起来你在这里并不需要它。comm可以比较两个文件并显示交集。使用你的确切示例:

$ comm -12 list.txt output.txt 
a.1
b.1
etc
  • -1隐藏第一个文件中特有的行
  • -2隐藏第二个文件中特有的行
  • -3抑制两者共有的线条
  • 为了得到共同的线条,我们抑制了独特的线条,因此-12

这比任何 grep 都快,但它严重依赖于正在排序的文件。如果没有,您可以预先对它们进行排序,但这会改变输出,因此它也已排序。

comm -12 <(sort list.txt) <(sort output.txt) 

或者,这个答案西摩将允许您使用 执行此操作grep。标志要求输入文件并强制进行固定字符串全字搜索。这不会依赖于顺序,但将基于顺序output.txt。如果您希望文件按 list.txt 的顺序排列,请反转文件。

$ grep -wFf list.txt output.txt 
a.1
b.1
etc

如果你list.txt真的big,您可能需要更反复地处理这个问题,并将每一行分别传递给 grep。这将大大增加处理时间。在上面,您将只读取output.txt一次,但这样您将读取并处理 list.txt 的每一行。这很糟糕……但这可能是您唯一的选择。从好的方面来看,它确实会按顺序对事物进行排序list.txt

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc

相关内容