具有不均匀列的两个文件的交集:打印出公共列的行

具有不均匀列的两个文件的交集:打印出公共列的行

我想比较两个文件,找到每个文件第 1 列之间的公共行,并打印出文件 1 的整行(多列)。

文件1:

一个苹果
电子鹰
克绿   
哈马   
我的冰屋
杰杰克

文件2:


C
d
e
F

我希望输出如下:


电子鹰

任何帮助深表感谢。

答案1

这是 coreutils 的工作:-)

如果文件已经排序并且第一列中有公共字段:

$ join file1 file2
c cat
e eagle
f fire

如果您的文件未排序:

join <(sort file1) <(sort file2)

答案2

$ awk 'NR==FNR { a[$1]++ ; next}; $1 in a' file2 file1
c   cat
e   eagle
f   fire

这会读入file2(第一个文件名参数)并将其存储在 array 中a。它通过检查NR(到目前为止看到的输入记录总数)是否等于FNR(当前输入文件的输入记录数)来检测是否正在读取第一个文件

然后它读取file1(第二个文件名参数),如果第一个字段在 array 中a,它会打印匹配的输入行(在 中awk,任何成功测试结果的默认操作,例如$1 in a,是打印输入行 - 所以$1 in a它本身就是相当于$1 in a {print})。


顺便说一句,在很多情况下,可以完成这样的任务,grep -f file2 file1但这将与 file2 的内容匹配任何地方在 file1 中 - 例如,c来自 file2 不仅会匹配cat,而且还会jack在 file1 中匹配。

答案3

在以下选项的帮助下使用grep's选项的解决方案(如 cas 建议):-fsed

$ grep -f <(sed 's/^/^/' file2) file1
c   cat
e   eagle
f   fire

命令sed 's/^/^/' file2将插入符号添加^到 中每行的开头file2。我们使用此输出作为使用过程替换 ( ) 的选项grep的模式输入文件。-f<(…)

该命令打印与命令替换模式匹配的grep那些行。file1我们需要^模式中的字符来匹配那些线条开始与给定的字符。

相关内容