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