3

我想比较两个文件的第二列。如果匹配,则将第二个文件中第三列的对应值打印到第一个文件中。如果未找到匹配项,请填写“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

谢谢

4

3 回答 3

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作为连接键
  • -a1: 左外连接file1
于 2013-09-03T12:53:59.860 回答
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
> 
于 2013-09-03T12:51:56.270 回答
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
于 2013-09-03T12:55:37.103 回答