我在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
答案 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
语句, next
在allofthem.txt
的每一行上运行。如果它是patterns
中的密钥,它会检查该文件的每一行。如果检查结果为true
awk
,则会打印该行。