通过在 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
以生成以下 漂亮的输出 :
我有两个文件如下:
文件 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
以生成以下 漂亮的输出 :