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


8

我有一个包含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

我还没有找到任何这样的例子


它们都像您的示例一样按字母顺序排列吗?
奥利(Oli)

不,我的list.txt中有特定的非字母顺序,但是output.txt是按字母顺序排列的,但是我希望它只包含相同的非字母顺序的list.txt的“匹配”
Ditte

Answers:


11

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

$ comm -12 list.txt output.txt 
a.1
b.1
etc

这比任何grep都要快,但是(严重)依赖于要排序的文件。如果不是,则可以对其进行预排序,但这会更改输出,因此也将对其进行排序。

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

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

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

如果你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

1
真的很聪明!-12的原因是什么?
Ditte

3
-1禁止显示第一个文件的-2唯一行,禁止显示第二个文件的唯一行,并-3禁止两个文件共有的行。为了只得到共同的线条,我们压制了唯一性,因此-12
奥利(Oli)

真好!我想我将使用comm命令。然后,当我想对output.txt进行排序以使其具有与list.txt相同的顺序时,之后我将只使用comm -12 <(sort list.txt)<(sort output.txt)?
Ditte

comm命令没有在result.txt中给我整行(我需要所有这些来从那里获取信息)。但是,如果我尝试使用grep命令,它会提示我grep:内存不足。这是否意味着太大?
Ditte

第二个示例具有冗余的STDIN重定向,shell会将其标记为错误。要么制作临时文件,要么使用额外的fd并通过管道将其进行后台排序(在大多数shell中都是棘手的)……这更多是关于Stack Overflow的编程问题。就个人而言,我会在python中执行此操作。
Skaperen'3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.