在2列上加入2个文件,为非匹配返回0

时间:2014-07-29 19:53:11

标签: unix join awk merge

我有两个已排序的文件,每个文件有3列。我需要根据前2个columsn合并它们并返回4列,即匹配的2列,然后是每个文件的第3列。我试过用awk做的

awk 'NR==FNR{a[$1FS$2]=$3;NEXT}   
  {k=$1FS$2;print k,(a[k]?a[k]:a[k]*1),$3;delete a[k]}        
  END{for(k in a)print k,a[k],"0"}' 

但是我的工作方式并没有改变。

我的输入文件如下所示:

文件1:

  

Chr BPPos Chip_1

     

1 1234 1

     

1 1765 2

     

1 2043 3

     

2 1231 4

文件2:

  

Chr BPPos Chip_2

     

1 1765 1

     

1 2074 2

     

2 1231 3

     

2 2141 4

期望的输出:

  

Chr BPPos Chip_1 Chip_2

     

1 1234 1 0

     

1 1765 2 1

     

1 2043 3 0

     

1 2073 0 2

     

2 1231 4 3

     

2 2141 0 4

非常感谢任何帮助!

史蒂夫

2 个答案:

答案 0 :(得分:2)

试试这个单行:

awk '{k=$1 FS $2}
     NR==FNR{a[k]=$3;next}
     k in a{print $0,a[k];delete a[k];next}{print $0,"0"}
     END{for(x in a)print x,"0",a[x]}' file2 file1

使用您的数据,输出为:

kent$  awk '{k=$1 FS $2}NR==FNR{a[k]=$3;next}k in a{print $0,a[k];delete a[k];next}{print $0,"0"}END{for(x in a)print x,"0",a[x]}' f2 f1
Chr BPPos Chip_1 Chip_2
1 1234 1 0
1 1765 2 1
1 2043 3 0
2 1231 4 3
1 2074 0 2
2 2141 0 4

答案 1 :(得分:0)

awk '{ k = $1 FS $2 } !a[k]++ { keys[i++] = k } FNR == NR { b[k] = $3; next } { c[k] = $3 } END { for (i = 0; i in keys; ++i) { k = keys[i]; print k, k in b ? b[k] : "0", k in c ? c[k] : "0" } }' file1 file2

输出:

Chr BPPos Chip_1 Chip_2
1 1234 1 0
1 1765 2 1
1 2043 3 0
2 1231 4 3
1 2074 0 2
2 2141 0 4