当匹配几列时,AWK替换$ 0的第二个文件

时间:2012-12-31 16:18:38

标签: regex bash awk

当两个第一列匹配两个文件并将第一个文件值替换为第二个文件列时,如何合并两个文件...我的意思是......

相同数量的列:

FILE 1:
121212,0100,1.1,1.2,
121212,0200,2.1,2.2,

FILE 2:
121212,0100,3.1,3.2,3.3,
121212,0130,4.1,4.2,4.3,
121212,0200,5.1,5.2,5.3,
121212,0230,6.1,6.2,6.3,

OUTPUT:
121212,0100,3.1,3.2,3.3,
121212,0200,5.1,5.2,5.3,

换句话说,我需要在两个文件中匹配$0$1时打印第二个文件的$2。我理解逻辑,但我无法使用数组实现它。显然应该使用它。

请花点时间解释一下代码。

2 个答案:

答案 0 :(得分:2)

使用awk打印模式文件中的前两个字段,然后通过管道grep进行匹配:

$ awk 'BEGIN{OFS=FS=","}{print $1,$2}' file1 | grep -f - file2
121212,0100,3.1,3.2,3.3,
121212,0200,5.1,5.2,5.3,

-f选项告诉grep从文件中获取模式,但使用-代替文件名会使grepstdin获取模式。

因此,第一个awk脚本生成file1中的模式,我们使用file2grep中对其进行管道匹配:

$ awk 'BEGIN{OFS=FS=","}{print $1,$2}' file1
121212,0100
121212,0200

您可能希望使用^将匹配项锚定到该行的开头:

$ awk 'BEGIN{OFS=FS=","}{print "^"$1,$2}' file1 
^121212,0100
^121212,0200

$ awk 'BEGIN{OFS=FS=","}{print "^"$1,$2}' file1 | grep -f - file2
121212,0100,3.1,3.2,3.3,
121212,0200,5.1,5.2,5.3,

答案 1 :(得分:1)

这是使用awk的一种方式:

awk -F, 'FNR==NR { a[$1,$2]; next } ($1,$2) in a' file1 file2

结果:

121212,0100,3.1,3.2,3.3,
121212,0200,5.1,5.2,5.3,