Bash,使用sort和join联接两个不同长度的表

时间:2018-10-14 14:45:32

标签: bash awk

我意识到这是重复的,对不起,其他帖子中的解决方案对我不起作用。

我有两个表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

感谢您的帮助。

2 个答案:

答案 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