0

この質問が以前にさまざまな方法で尋ねられたことは知っていますが、これまでのところ解決策を見つけることができませんでした.

2 つの異なる列に結合したままにしたいヘッダーのない 2 つのファイルがありますがjoin、私のファイル (またはそれらの 1 つ) がまだソートされていないと文句を言います。

もう 1 つのことは、パイプ内の最初のファイルを使用する必要があることです (これが、cat以下の例で使用する理由です。

ここに私の2つのファイルがあります

# 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

実際には、2 番目のファイルははるかに大きくなります (約 100,000 行)。

out1の 2 列目と の 1 列目に基づいて 2 つのファイルを結合します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、これも良いことです。

どうもありがとう!

4

1 に答える 1