shell脚本中的AWK - 如何根据共享密钥(2个常用字段)比较和合并两个文件?

时间:2012-08-29 07:17:39

标签: shell unix awk ksh

有人可以帮助比较两个文件, 我使用了以下命令,但我无法成功,

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

这是我的需要, 需要比较以下两个dat文件中的前两个字段,并按照预期在file3中合并结果(第一个字段,第二个字段,temp1.dat的3个字段,temp2.​​dat的3个字段)

File1中: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

2 个答案:

答案 0 :(得分:3)

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作为数组中的索引存在,然后第二个条件是将file1的第3个字段更改为$3=$3","a[$1$2]所以现在$0包含公共($1$2)行改变了第3个字段。

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

答案 1 :(得分:1)

尝试:

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