AWK在shell脚本中 – 如何比较和合并基于共享密钥的两个文件(2个公共字段)?

有人可以帮忙比较两个文件,我已经使用了下面的命令,但我不能成功,

awk -F,'NR == FNR {a [$ 1,$ 2]; 下一个}(($ 1,$ 2)在a)'temp1.dat temp2.​​dat

这里是我的需要,需要比较下面两个dat文件中的前两个字段,并将结果合并到file3(第一个字段,第二个字段,temp1.dat的第三个字段,temp2.​​dat的第三个字段)

文件1:temp1.dat

A, AB,100 B,BB,200 C,CC,300 

文件2:temp2.​​dat

 A,AB,10 C,CC,30 D,DF, 4 

File3:输出

 A, AB,100,10 C,CC,300,30 

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

测试如下:

 > cat file1 A,AB,100 B,BB,200 C,CC,300 > cat file2 A,AB,10 C,CC,30 D,DF,4 > awk -F, 'BEGIN{OFS=","}FNR==NR{a[$1$2]=$3;next}($1$2 in a && $3=$3","a[$1$2])' file2 file1 A,AB,100,10 C,CC,300,30 > 
  • FNR==NR{a[$1$2]=$3;next}应用于第一个文件file2
  • 它说直到FNR==NR执行代码块。
  • FNR =当前文件的行号
  • NR =两个文件总行的行数。
  • 所以在上面的语句后索引为$1$2和值为$3的关联数组。
  • 现在($1$2 in a && $3=$3","a[$1$2])执行FNR!=NR 。其中检查索引$ 1 $ 2作为索引存在于数组中,然后第二个条件改变文件1的第三个字段为$3=$3","a[$1$2]所以现在$0包含共同的( $1$2 )线,其中改变了第三个字段。

类似的逻辑也必须写入四个文件。

尝试:

 awk -F, '{i=$1 SUBSEP $2} NR==FNR{A[i]=$3; next} i in A{print $0,A[i]}' file2 file1