我想比较两个文件,找到每个文件第 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 建议):-f
sed
$ grep -f <(sed 's/^/^/' file2) file1
c cat
e eagle
f fire
命令sed 's/^/^/' file2
将插入符号添加^
到 中每行的开头file2
。我们使用此输出作为使用过程替换 ( ) 的选项grep
的模式输入文件。-f
<(…)
该命令打印与命令替换模式匹配的grep
那些行。file1
我们需要^
模式中的字符来匹配那些线条开始与给定的字符。