我试图在文件A的第1列与文件B的第2列之间找到匹配的字符串,并为每次匹配打印文件A +文件B的整行。问题是文件A的第1列中有多个具有相同值的字符串,当我使用awk解决方案时,它只会打印最后一个匹配项,而不是所有匹配项。
我尝试使用以前使用过的awk解决方案来匹配文件A和文件B中的唯一值
awk -vOFS='\t' 'NR==FNR{a[$1]=$0;next} ($2 in a) {print a[$2],$0}' file A file B
文件A
MLLT3 26.53051423 54.24992354 25.50216856
MLLT3 24.32536694 19.96855016 177.7584507
MLLT3 18.9883621 15.83462512 115.2035222
MLLT3 11.79811105 42.91062427 77.35888553
文件B
ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
预期输出:
MLLT3 26.53051423 54.24992354 25.50216856 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
MLLT3 24.32536694 19.96855016 177.7584507 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
MLLT3 18.9883621 15.83462512 115.2035222 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
MLLT3 11.79811105 42.91062427 77.35888553 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
实际输出:
MLLT3 11.79811105 42.91062427 77.35888553 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.00532152
我愿意接受任何解决方案,过去我只是将awk用于此类问题。
答案 0 :(得分:4)
由于在文件A中重复了密钥,但在文件B中没有重复密钥,请尝试:
$ awk -vOFS='\t' 'NR==FNR{a[$2]=$0;next} ($1 in a) {print $0,a[$1]}' fileB fileA
MLLT3 26.53051423 54.24992354 25.50216856 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
MLLT3 24.32536694 19.96855016 177.7584507 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
MLLT3 18.9883621 15.83462512 115.2035222 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
MLLT3 11.79811105 42.91062427 77.35888553 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
答案 1 :(得分:2)
我根本不会使用awk。这就是join设计的目的:
$ join -t $'\t' -1 1 -2 2 -o 1.1,1.2,1.3,1.4,2.1,2.2,2.3,2.4,2.5 file1.tsv file2.tsv
MLLT3 26.53051423 54.24992354 25.50216856 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
MLLT3 24.32536694 19.96855016 177.7584507 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
MLLT3 18.9883621 15.83462512 115.2035222 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
MLLT3 11.79811105 42.91062427 77.35888553 ENSG00000171843 MLLT3 3.885477052 3.929504522 3.005321522
这假定文件在相关字段上排序。如果没有:
$ join -t $'\t' -1 1 -2 2 -o 1.1,1.2,1.3,1.4,2.1,2.2,2.3,2.4,2.5 <(sort -t $'\t' -k1 file1.tsv) <(sort -t $'\t' -k2 file2.tsv)