如何查找包含另一个文件中任意字符串的行?

5
我有两个CSV文件。文件A有多列,文件B只有一列。 例如: 文件A:
chr1 100000 100022 A C GeneX
chr2 200000 200033 X GeneY
chr3 300000 300055 G A GeneZ

文件 B:
GeneY
GeneZ

我希望我的输出是:
chr2 200000 200033 X GeneY
chr3 300000 300055 G A GeneZ

我已经尝试使用grep(它崩溃了)和其他方法。
我确信这一定有一个非常简单的答案,只是我看不到!

如果grep崩溃了,你在哪个平台上?你正在处理多大的文件?你说当你尝试使用grep -f FileB FileA时出现了“内存不足”错误。在这种情况下,最好的选择可能是将FileB分成小块,以便可以在没有grep崩溃的情况下进行处理。显然的缺点是,与原始的FileA相比,结果集中的行将是无序的。如果FileB中的两个单词可以出现在同一行中,则您还可能遇到重复的情况。 - Jonathan Leffler
谢谢。我一直无法让sed工作。 - Chris Dias
不好意思,请您确认一下您正在使用的平台以及两个文件的大小(行数和字节数),这对我们进行编程工作非常有帮助。 - Jonathan Leffler
我一直在尝试在Bash终端中使用Unix。文件A只有1500行的1列。文件B是1.2M,有5800行。 - Chris Dias
是的,它们不是很大,这就是为什么我正在努力。我在 Darwin Kernel 版本 13.4.0 上。 - Chris Dias
显示剩余4条评论
2个回答

3
使用 grep -f
grep -f FileB FileA

谢谢,Amit。不幸的是,当我尝试在大型数据集上运行grep时,会收到内存不足的错误消息。 - Chris Dias
1
@ChrisDias - 你可以尝试在设置区域环境变量后使用 export LC_ALL=C 命令。来源 - https://dev59.com/t2ox5IYBdhLWcg3wpV3F#11777835 - Amit

0

以下是使用 awk 的方法:

awk 'FNR==NR {a[$0];next} {for (i in a) if (i~$1) print i}' FileA FileB
chr2 200000 200033 X GeneY
chr3 300000 300055 G A GeneZ

或者像这样:
awk 'FNR==NR {a[$0];next} ($NF in a)' FileB FileA
chr2 200000 200033 X GeneY
chr3 300000 300055 G A GeneZ

谢谢Jotne。我尝试了这个,但是输出为空。我的文件既有.csv格式的,也有制表符分隔的.txt格式的;但两者都不起作用。 - Chris Dias
@ChrisDias 在您提供的数据上运行良好。那么,您的数据格式可能有所不同。 - Jotne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接