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

Dit*_*tte 9 bash grep

我有一个包含 250 行的列表。我必须通过网络服务器运行所有这些以获得输出列表。然而,这个列表返回的行比我感兴趣的要多得多。比如说,我的list.txt是:

a.1
b.1
etc
Run Code Online (Sandbox Code Playgroud)

那么输出是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
Run Code Online (Sandbox Code Playgroud)

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

grep list.txt output.txt > wanted.txt
Run Code Online (Sandbox Code Playgroud)

我一直无法找到这方面的任何例子

Oli*_*Oli 11

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

$ comm -12 list.txt output.txt 
a.1
b.1
etc
Run Code Online (Sandbox Code Playgroud)

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

comm -12 <(sort list.txt) <(sort output.txt) 
Run Code Online (Sandbox Code Playgroud)

或者,这个答案iiSeymour将让你做到这一点grep。这些标志要求输入文件并强制进行固定字符串、全字搜索。这不会依赖于订单,而是基于output.txt订单。如果需要,请按照 list.txt 的顺序反转文件。

$ grep -wFf list.txt output.txt 
a.1
b.1
etc
Run Code Online (Sandbox Code Playgroud)

如果你list.txt真的大了,你可能要多一些迭代解决这个并通过各行分别用grep。这将大大增加处理时间。在上面你会读output.txt一次,但是这样你会为每个 list.txt 行阅读和处理它。这太可怕了……但这可能是你唯一的选择。从好的方面来说,它会按list.txt顺序对事物进行排序。

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc
Run Code Online (Sandbox Code Playgroud)

  • `-1` 禁止第一个文件特有的行,`-2` 禁止第二个文件特有的行,`-3` 禁止两个文件共有的行。为了只获得公共行,我们抑制了唯一性,因此是“-12”。 (3认同)