awk比较两个文件中的列,估算另一列的值

时间:2013-09-03 12:47:58

标签: unix awk

我想比较两个文件中的第二列。如果匹配,则将第三列的相应值从第二个文件打印到第一个文件。如果未找到匹配项,请填写“NA”

File 1

1      rs1    AA    10
1      rs2    DD    20
1      rs3    EE    30
1      rs4    RR    40


File 2

1      rs1    Pascal
1      rs4    Albinoni


Desired output

1      rs1    AA    10    Pascal
1      rs2    DD    20    NA
1      rs3    EE    30    NA
1      rs4    RR    40    Albinoni

我使用过此代码,但只输出匹配项:

awk 'NR==FNR { a[$1]=$2; next} $1 in a {print $0, a[$1]}' File2 File1

谢谢

3 个答案:

答案 0 :(得分:3)

awk 'FNR==NR{a[$2]=$3;next}{print $0,a[$2]?a[$2]:"NA"}' file2 file1

测试如下:

> cat temp1
1      rs1    AA    10
1      rs2    DD    20
1      rs3    EE    30
1      rs4    RR    40
> cat temp2
1      rs1    Pascal
1      rs4    Albinoni
> awk 'FNR==NR{a[$2]=$3;next}{print $0,a[$2]?a[$2]:"NA"}' temp2 temp1
1      rs1    AA    10 Pascal
1      rs2    DD    20 NA
1      rs3    EE    30 NA
1      rs4    RR    40 Albinoni
> 

答案 1 :(得分:3)

不完全是你想要的,但使用小工具总是很好。您可以使用join

$ join -1 2 -2 2 -a1 file1 file2
rs1 1 AA 10 1 Pascal
rs2 1 DD 20
rs3 1 EE 30
rs4 1 RR 40 1 Albinoni

说明:

  • -1 2:使用file1的第二个字段作为连接键
  • -2 2:使用file2的seceond字段作为连接键
  • -a1:在file1上留下外部联接。

答案 2 :(得分:2)

awk 'NR==FNR{a[$2]=$3;next;}{print $0 "    " ($2 in a ? a[$2] : "NA")}' file2 file1

输出:

1      rs1    AA    10    Pascal
1      rs2    DD    20    NA
1      rs3    EE    30    NA
1      rs4    RR    40    Albinoni