file1 の列値が file2 に存在する場合は、file1 のすべての行値を file2 に追加します。

file1 の列値が file2 に存在する場合は、file1 のすべての行値を file2 に追加します。

ファイルが2つあります。

ファイルA

Aacs    4498.5  778.5   995.5   1263    530
Abracl  2824    19.31   58.45   55.67   33.075
Ackr3   1294.5  19.5    47.5    38.5    4.5
Actb    246564  4472.46 11134.1 12272.6 2228.05

文書B

chr5    124350754       124353027       Aacs    1639_47_175_59_95
chr5    125140780       125141989       Aacs    920_132_115_65_389
chr5    125148638       125149481       Aacs    357_56_65_48_116
chr1    89576587        89577508        Ackr3   618_804_385_412_1239
chr1    89579859        89582071        Ackr3   1340_429_274_242_611
chr5    142819302       142820142       Actb    614_116_105_58_371
chr5    142821400       142822219       Actb    544_74_97_45_118

FileAの列1の値がFileBに存在する場合は、一致する値がFileBに複数回表示されても、FileAのすべての行の値をFileBに追加する必要があります。

だからそれ以来FileAがFileBに存在する場合は、すべての対応する値を次のようにFileBに複数回追加したいと思います。

chr5    124350754       124353027       Aacs    1639_47_175_59_95    4498.5  778.5   995.5   1263    530
chr5    125140780       125141989       Aacs    920_132_115_65_389    4498.5  778.5   995.5   1263    530
chr5    125148638       125149481       Aacs    357_56_65_48_116    4498.5  778.5   995.5   1263    530

Pythonではpandasを使ってこれを行うことができますが、awkや他のunixツールキットを使ってこれを行う方法を見つけたいと思います。

答え1

$ awk 'NR==FNR{key=$1; sub(/[^[:space:]]+/,""); a[key]=$0; next} {print $0 a[$4]}' FileA FileB
chr5    124350754       124353027       Aacs    1639_47_175_59_95    4498.5  778.5   995.5   1263    530
chr5    125140780       125141989       Aacs    920_132_115_65_389    4498.5  778.5   995.5   1263    530
chr5    125148638       125149481       Aacs    357_56_65_48_116    4498.5  778.5   995.5   1263    530
chr1    89576587        89577508        Ackr3   618_804_385_412_1239   1294.5  19.5    47.5    38.5    4.5
chr1    89579859        89582071        Ackr3   1340_429_274_242_611   1294.5  19.5    47.5    38.5    4.5
chr5    142819302       142820142       Actb    614_116_105_58_371    246564  4472.46 11134.1 12272.6 2228.05
chr5    142821400       142822219       Actb    544_74_97_45_118    246564  4472.46 11134.1 12272.6 2228.05

出力のフィールドをソートしたい場合は、さまざまなオプションがあり、最も簡単な方法は次にパイプすることですcolumn

$ awk 'NR==FNR{key=$1; sub(/[^[:space:]]+/,""); a[key]=$0; next} {print $0 a[$4]}' FileA FileB | column -t
chr5  124350754  124353027  Aacs   1639_47_175_59_95     4498.5  778.5    995.5    1263     530
chr5  125140780  125141989  Aacs   920_132_115_65_389    4498.5  778.5    995.5    1263     530
chr5  125148638  125149481  Aacs   357_56_65_48_116      4498.5  778.5    995.5    1263     530
chr1  89576587   89577508   Ackr3  618_804_385_412_1239  1294.5  19.5     47.5     38.5     4.5
chr1  89579859   89582071   Ackr3  1340_429_274_242_611  1294.5  19.5     47.5     38.5     4.5
chr5  142819302  142820142  Actb   614_116_105_58_371    246564  4472.46  11134.1  12272.6  2228.05
chr5  142821400  142822219  Actb   544_74_97_45_118      246564  4472.46  11134.1  12272.6  2228.05

答え2

以下を使用して、2つのファイルを簡単にリンクできます。参加(1)

join -1 1 -2 4 -o 2.1,2.2,2.3,2.4,2.5,1.2,1.3,1.4,1.5,1.6 FileA FileB

任意の列を指定します。-1そして-2ファイル1(FileA)と2(FileB)を結合しようとしています。これ- モールド出力例に合わせて。出力をきれいな列として表示するには、出力を次にパイプします。column -t

関連情報