我有两个已排序的文件,每个文件有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
非常感谢任何帮助!
史蒂夫
答案 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