如何使用awk获取两个文件之间的公共行

时间:2016-03-30 23:16:21

标签: awk

我有两个文件有一些共同点。

file1的值由“;”

分隔
20160301 000000;0.713290;0
20160301 000001;0.713270;0
20160301 000003;0.713280;0
20160301 000005;0.713270;0
20160301 000006;0.713280;0
20160301 000010;0.713250;0
20160301 000011;0.713260;0
20160301 000012;0.713260;0
20160301 000013;0.713260;0
...

file2的:

20160301 000000  
20160301 000001  
20160301 000003  

期望的输出:

20160301 000000;0.713290;0
20160301 000001;0.713270;0
20160301 000003;0.713280;0

我已经尝试了grep -f,但由于两个文件(file1& file 2)都很庞大,我花了很长时间才能完成。 我正在寻找使用awk

的替代方案

3 个答案:

答案 0 :(得分:1)

awk -F';' 'NR==FNR{a[$0];next} $1 in a' file2 file1

给出你的新输入,其中file2行可以有尾随空白字符:

$ tr ' ' '#' < file1
20160301#000000;0.713290;0
20160301#000001;0.713270;0
20160301#000003;0.713280;0
20160301#000005;0.713270;0
20160301#000006;0.713280;0
20160301#000010;0.713250;0
20160301#000011;0.713260;0
20160301#000012;0.713260;0
20160301#000013;0.713260;0
...

$ tr ' ' '#' < file2
20160301#000000##
20160301#000001##
20160301#000003

$ awk -F';' 'NR==FNR{sub(/ +$/,""); a[$0];next} $1 in a' file2 file1
20160301 000000;0.713290;0
20160301 000001;0.713270;0
20160301 000003;0.713280;0

答案 1 :(得分:1)

如果您的文件已经在关键字段中排序(如您的情况那样)

$ join -t';' file1 file2
1 1;adc;01
2 2;efg;02
3 3;hij;03

这是join命令的典型用例。如果没有排序,您可以传递已排序的输出

$ $ join -t';' <(sort file1) <(sort file2)

答案 2 :(得分:0)

也许:

awk 'NR==FNR{A[$1];next}$1 in A' file2 file1  

这是未经测试的,我在我的牢房中,所以如果这不是你想要的话,我道歉:)