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

Bash,使用sort和join连接两个不同长度的表,bash,awk,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

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

我有两张桌子,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
,则第二列中的数字将移位:

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

谢谢你的帮助。

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

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

使用join、sort和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

使用join、sort和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

Bash并不是这项工作的最佳工具。相反,我建议您使用Python进行快速旋转。Bash并不是这项工作的最佳工具。我建议改为使用Python进行快速旋转。如果我想在大约90个文件中应用此命令以生成一个表,您是否可以建议我需要更改哪些内容?此脚本不会扩展到90个文件,但对于2个以上的文件,
join
不是合适的工具。也许可以问另一个问题。如果我想在大约90个文件中应用此命令以生成一个表,您是否可以建议我需要更改哪些内容?此脚本不会扩展到90个文件,但对于2个以上的文件,
join
不是合适的工具。也许可以问另一个问题。