Unix 联接2列上的2个文件,对于不匹配项返回0
我有2个文件,已排序,每个文件有3列。我需要根据前2列合并它们,并返回4列,即匹配的2列,然后是每个文件的第3列。我试着在awk中使用Unix 联接2列上的2个文件,对于不匹配项返回0,unix,join,awk,merge,Unix,Join,Awk,Merge,我有2个文件,已排序,每个文件有3列。我需要根据前2列合并它们,并返回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芯片_1
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芯片_1
112341
117652
120433
212314
文件2:
Chr BPPos芯片2
117651
12074 2
212313
221414
期望输出:
Chr BPPos芯片1芯片2
1123410
1176521
1204330
1207302
2 1231 4 3
2214104
任何帮助都将不胜感激
史蒂夫试试这一行:
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
输出:
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
这似乎给了我一个奇怪的格式在文件的顶部,我的头是不正确的,由于某种原因,第一列和最后一列似乎已经加入。也许我的数据不太正确,我会做一些编辑,然后再试一次,但下面的评论似乎有效,但速度要慢得多。感谢您在这里的帮助,我觉得我应用您的解决方案可能没有做到公正。@slarmer1我用您提供的两个示例进行了测试,您可以看到,输出与答案一起发布。如果问题中的数据格式不是file1 file2,那么输出可能会不同。无论如何,既然你们已经展示了你们的代码,我想你们应该知道awk编程。你可以阅读我的代码,理解我的想法,做相应的改变来适应你的数据。我想我现在已经把它整理好了。再次感谢!我认为这工作得很好,文件很大,所以需要一段时间来检查和确认,但我认为这确实起到了作用。非常感谢。
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