【发布时间】:2019-09-07 15:48:28
【问题描述】:
我知道以前曾以各种方式提出过这个问题,但到目前为止我找不到解决方案。
我有两个没有标题的文件,我想将它们留在两个不同的列上,但join 抱怨我的文件(或其中一个文件)尚未排序。
另一件事是我需要使用管道中的第一个文件(这就是我在下面的示例中使用cat 的原因。
这是我的两个文件
# out1
Ad_12351 gnl|Prokka|Ad_18
Ad_12368 gnl|Prokka|Ad_18
Ad_12369 gnl|Prokka|Ad_18
Ad_80878 gnl|Prokka|Ad_6311
# out2
gnl|Prokka|Ad_1 NODE_1_length_1532695_cov_20.805081 100.000 1532695 0 0 1 1532695 1 1532695 0.0 2.830e+06
gnl|Prokka|Ad_2 NODE_2_length_1110392_cov_51.706023 100.000 1110392 0 0 1 1110392 1 1110392 0.0 2.051e+06
gnl|Prokka|Ad_3 NODE_3_length_1073395_cov_25.049683 100.000 1073395 0 0 1 1073395 1 1073395 0.0 1.982e+06
gnl|Prokka|Ad_4 NODE_4_length_942458_cov_21.166101 100.000 942458 0 0 1 942458 1 942458 0.0 1.740e+06
gnl|Prokka|Ad_5 NODE_5_length_934614_cov_54.686741 100.000 934614 0 0 1 934614 1 934614 0.0 1.726e+06
gnl|Prokka|Ad_6 NODE_6_length_822594_cov_21.071332 100.000 822594 0 0 1 822594 1 822594 0.0 1.519e+06
gnl|Prokka|Ad_7 NODE_7_length_775953_cov_51.943039 100.000 775953 0 0 1 775953 1 775953 0.0 1.433e+06
gnl|Prokka|Ad_8 NODE_8_length_669799_cov_20.124807 100.000 669799 0 0 1 669799 1 669799 0.0 1.237e+06
gnl|Prokka|Ad_9 NODE_9_length_669094_cov_52.446878 100.000 669094 0 0 1 669094 1 669094 0.0 1.236e+06
gnl|Prokka|Ad_10 NODE_10_length_656226_cov_8.484500 100.000 656226 0 0 1 656226 1 656226 0.0 1.212e+06
gnl|Prokka|Ad_11 NODE_11_length_561745_cov_235.394513 100.000 561745 0 0 1 561745 1 561745 0.0 1.037e+06
gnl|Prokka|Ad_12 NODE_12_length_557414_cov_8.035369 100.000 557414 0 0 1 557414 1 557414 0.0 1.029e+06
gnl|Prokka|Ad_13 NODE_13_length_540856_cov_40.368085 100.000 540856 0 0 1 540856 1 540856 0.0 9.988e+05
gnl|Prokka|Ad_14 NODE_14_length_510936_cov_13.262043 100.000 510936 0 0 1 510936 1 510936 0.0 9.435e+05
gnl|Prokka|Ad_15 NODE_15_length_471976_cov_52.281100 100.000 471976 0 0 1 471976 1 471976 0.0 8.716e+05
gnl|Prokka|Ad_16 NODE_16_length_469438_cov_40.667960 100.000 469438 0 0 1 469438 1 469438 0.0 8.669e+05
gnl|Prokka|Ad_17 NODE_17_length_468675_cov_21.008559 100.000 468675 0 0 1 468675 1 468675 0.0 8.655e+05
gnl|Prokka|Ad_18 NODE_18_length_465405_cov_219.905046 100.000 465405 0 0 1 465405 1 465405 0.0 8.594e+05
gnl|Prokka|Ad_19 NODE_19_length_464169_cov_13.391522 100.000 464169 0 0 1 464169 1 464169 0.0 8.572e+05
gnl|Prokka|Ad_20 NODE_20_length_415362_cov_20.670704 100.000 415362 0 0 1 415362 1 415362 0.0 7.670e+05
gnl|Prokka|Ad_21 NODE_21_length_411782_cov_56.949841 100.000 411782 0 0 1 411782 1 411782 0.0 7.604e+05
gnl|Prokka|Ad_22 NODE_22_length_408727_cov_13.361336 100.000 408727 0 0 1 408727 1 408727 0.0 7.548e+05
实际上,第二个文件要大得多(大约 100,000 行)。
这是我想要做的:我想加入基于out1 的第二列和out2 的第一列的两个文件。
加入而不排序会给我一个错误,因为文件没有排序,但是当我之前尝试对两个文件进行排序时会发生同样的事情:
cat out1 | sort -k 2 | join -1 2 -2 1 - <(sort -k 1 out2)
gnl|Prokka|Ad_18 Ad_12351 NODE_18_length_465405_cov_219.905046 100.000 465405 0 0 1 465405 1 465405 0.0 8.594e+05
gnl|Prokka|Ad_18 Ad_12368 NODE_18_length_465405_cov_219.905046 100.000 465405 0 0 1 465405 1 465405 0.0 8.594e+05
gnl|Prokka|Ad_18 Ad_12369 NODE_18_length_465405_cov_219.905046 100.000 465405 0 0 1 465405 1 465405 0.0 8.594e+05
join: /dev/fd/63:11: is not sorted: gnl|Prokka|Ad_1 NODE_1_length_1532695_cov_20.805081 100.000 1532695 0 0 1 1
532695 1 1532695 0.0 2.830e+06
当我尝试在没有管道的情况下这样做时会发生同样的事情(它会产生完全相同的错误):
join -1 2 -2 1 <(sort -k 2 out1) <(sort -k 1 out2)
我最后想要的是一个像这样的表格
Ad_12351 gnl|Prokka|Ad_18 NODE_18_length_465405_cov_219.905046
Ad_12368 gnl|Prokka|Ad_18 NODE_18_length_465405_cov_219.905046
Ad_12369 gnl|Prokka|Ad_18 NODE_18_length_465405_cov_219.905046
Ad_80878 gnl|Prokka|Ad_6311
但我也可以稍后使用cut 删除其他列。
如果有人用awk 而不是join 有解决方案,这也很好。
非常感谢!
【问题讨论】: