我意识到这是重复的,对不起,其他帖子中的解决方案对我不起作用。
我有两个表testcut.pileup:
chrM 1370 T 1
chrM 1371 T 1
chrM 1372 C 1
chrM 1373 T 1
chrM 1374 A 1
和testcut2.pileup:
chrM 720 T 1
chrM 721 T 1
chrM 722 C 1
chrM 723 A 0
chrM 724 C 1
chrM 1370 T 2
chrM 1371 T 3
chrM 1372 C 4
chrM 1373 T 3
chrM 1374 A 2
我想加入这些数据集,使它们彼此并列。在理想的世界中,这些内容将通过第二列中的数字进行组织(如下所示),但我很高兴将它们彼此并列。
所需结果:
chrM 720 T 1
chrM 721 T 1
chrM 722 C 1
chrM 723 A 0
chrM 724 C 1
chrM 1370 T 1 chrM 1370 T 2
chrM 1371 T 1 chrM 1371 T 3
chrM 1372 C 1 chrM 1372 C 4
chrM 1373 T 1 chrM 1373 T 3
chrM 1374 A 1 chrM 1374 A 2
到目前为止,我正在尝试:
join -j 2 <(sort -k 2 testcut.pileup) <(sort -k 2 testcut2.pileup) > join.pileup
但是我收到以下错误:
join: file 1 is not in sorted order
join: file 2 is not in sorted order
如果我连续join
运行,第二列中的数字将移位:
chrM 1370 T 1 720 T 1
chrM 1370 T 1 721 T 1
chrM 1370 T 1 722 C 1
chrM 1370 T 1 723 A 0
chrM 1370 T 1 724 C 1
感谢您的帮助。
答案 0 :(得分:2)
awk
来营救!
您可以使其更通用,但我对4个字段进行了硬编码
$ awk 'NR==FNR {a[$2]=$0; next}
{print $2 in a?a[$2] "\t" $0:"\t\t\t\t"$0}' file{1,2} |
column -ts'\t'
chrM 720 T 1
chrM 721 T 1
chrM 722 C 1
chrM 723 A 0
chrM 724 C 1
chrM 1370 T 1 chrM 1370 T 2
chrM 1371 T 1 chrM 1371 T 3
chrM 1372 C 1 chrM 1372 C 4
chrM 1373 T 1 chrM 1373 T 3
chrM 1374 A 1 chrM 1374 A 2
答案 1 :(得分:2)
使用join,排序和bash:
join -j 2 <(sort -t $'\t' -k 2 testcut.pileup) <(sort -t $'\t' -k 2 testcut2.pileup) -a 2 -t $'\t' -o1.1,1.2,1.3,1.4,2.1,2.2,2.3,2.4 | sort -t $'\t' -k6n
我认为您的字段分隔符是一个标签。
输出:
chrM 720 T 1
chrM 721 T 1
chrM 722 C 1
chrM 723 A 0
chrM 724 C 1
chrM 1370 T 1 chrM 1370 T 2
chrM 1371 T 1 chrM 1371 T 3
chrM 1372 C 1 chrM 1372 C 4
chrM 1373 T 1 chrM 1373 T 3
chrM 1374 A 1 chrM 1374 A 2