如何在终端上的文件中使用grep -f检测某些模式,并在没有模式

时间:2017-03-09 17:05:22

标签: bash awk grep

我在mac终端上。 我有一个txt文件,其中一列有9个ID,allofthem.txt,其中每个ID都以¨rs¨开头:

rs382216
rs11168036
rs9296559
rs9349407
rs10948363
rs9271192
rs11771145
rs11767557
rs11

另外,我有另一个txt文件,useful.txt,以及那些在我做过的分析中有用的ID。它看起来是一样的,一列有几行ID,但IDS较少,只有5.

rs9349407
rs10948363
rs9271192
rs11

问题:我想生成一个新的txt文件,其中包含无效的文件(出现在allofthem.txt中但不在有用的.txt中)。

我想反过来:

grep -f useful.txt allofthem.txt 

我想使用一些系统的方法删除有用的所有ID,并获取剩余的ID。也许用awk或sed,但我看不到它。你能帮我吗?提前谢谢!

期望的输出:

rs382216
rs11168036
rs9296559
rs11771145
rs11767557

2 个答案:

答案 0 :(得分:3)

-v选项为您做反过来:

grep -vxf useful.txt allofthem.txt > remaining.txt

-x选项匹配allofthem.txt中的整行,而不是部分。

正如@ hek2mgl正确指出的那样,如果你想将useful.txt的内容视为字符串而不是模式,则需要-F

grep -vxFf useful.txt allofthem.txt > remaining.txt

确保您的文件没有前导或尾随空格 - 它们可能会影响结果。

答案 1 :(得分:3)

我建议使用awk

awk 'FNR==NR{patterns[$0];next} $0 in patterns' useful.txt allofthem.txt

说明:

只要我们正在阅读FNR==NR

useful.txt就是真的。我们为patterns的每一行useful.txt创建一个索引。 next停止进一步处理。

由于上一个$0 in patterns语句,

nextallofthem.txt的每一行上运行。如果它是patterns中的密钥,它会检查该文件的每一行。如果检查结果为true awk,则会打印该行。