通过在 shell 中保持两个文件中的某些列完整,对两个文件进行完全外部连接

Full outer join on both files by keeping certain columns in both the files intact in shell

我有两个文件如下:

文件 1:

ABC_1   123 E   +   7.595927    Anotation1
ABC_2   456 E   -   7.369319    Anotation2
EFG_1   261 E   -   7.259135    Anotation3
EFG_2   947 E   -   5.021707    Anotation4
EFG_3   1   E   +   7.398731    Anotation5
HIJ_1   12  E   +   7.398731    Anotation6
HIJ_2   14  E   -   5.496079    Anotation7

文件 2:

ABC_1   123 E   +   inclusion   0.165805338
ABC_2   456 E   -   inclusion   0.165805338
EFG_1   261 E   -   inclusion   0.165805338
EFG_2   947 E   -   inclusion   0.165805338
EFG_3   1   E   +   inclusion   0.165805338
LMN_1   21  I   -   exclusion   0.5
LMN_2   43  I   -   inclusion   0.3

有没有办法在两个文件上创建一个连接,这样前 5 列将保留如下,显然假设每个文件中会有一些行没有连接,在这种情况下无论文件如何,前 4 列都将保留,其他字段为空白,具体格式如下:

ABC_1   123 E   +   7.595927    Anotation1  inclusion   0.165805338
ABC_2   456 E   -   7.369319    Anotation2  inclusion   0.165805338
EFG_1   261 E   -   7.259135    Anotation3  inclusion   0.165805338
EFG_2   947 E   -   5.021707    Anotation4  inclusion   0.165805338
EFG_3   1   E   +   7.398731    Anotation5  inclusion   0.165805338
HIJ_1   12  E   +   7.398731    Anotation6  NULL    NULL
HIJ_2   14  E   -   5.496079    Anotation7  NULL    NULL
LMN_1   21  I   -   NULL    NULL    exclusion   0.5
LMN_2   43  I   -   NULL    NULL    inclusion   0.3

我确实尝试了 join -a 1 -a 2 -e NULL -o 命令,但它没有给我所需的顺序和格式

您可以使用以下命令链来执行连接操作:

$ (join -a1 -a2 -e NULL -o '1.1 1.2 1.3 1.4 1.5 1.6 2.5 2.6' file1 file2; join -a1 -a2 -e NULL -o '2.1 2.2 2.3 2.4 1.5 1.6 2.5 2.6' file1 file2 )| grep -v '^NULL' | sort -k 1,2 | uniq

在您的输入文件中,它产生:

$ (join -a1 -a2 -e NULL -o '1.1 1.2 1.3 1.4 1.5 1.6 2.5 2.6' file1 file2; join -a1 -a2 -e NULL -o '2.1 2.2 2.3 2.4 1.5 1.6 2.5 2.6' file1 file2 )| grep -v '^NULL' | sort -k 1,2 | uniq
ABC_1 123 E + 7.595927 Anotation1 inclusion 0.165805338
ABC_2 456 E - 7.369319 Anotation2 inclusion 0.165805338
EFG_1 261 E - 7.259135 Anotation3 inclusion 0.165805338
EFG_2 947 E - 5.021707 Anotation4 inclusion 0.165805338
EFG_3 1 E + 7.398731 Anotation5 inclusion 0.165805338
HIJ_1 12 E + 7.398731 Anotation6 NULL NULL
HIJ_2 14 E - 5.496079 Anotation7 NULL NULL
LMN_1 21 I - NULL NULL exclusion 0.5
LMN_2 43 I - NULL NULL inclusion 0.3

说明:

  • (join -a1 -a2 -e NULL -o '1.1 1.2 1.3 1.4 1.5 1.6 2.5 2.6' file1 file2; join -a1 -a2 -e NULL -o '2.1 2.2 2.3 2.4 1.5 1.6 2.5 2.6' file1 file2 ) 将生成包含 file1 中不存在的行和 file2 中不存在的行的所需输出的连接操作!这些行将以 NULL
  • 开头
  • grep -v '^NULL' | sort -k 1,2 | uniq 将删除那些以 NULL 开头的行,而 sort -k 1,2 | uniq 将处理重复项。

最后但同样重要的是,出于格式化目的,您可以在命令末尾添加 |column -t 以生成以下 漂亮的输出