如果 file1 中的列值存在于 file2 中,则将 file1 中的所有行值添加到 file2

如果 file1 中的列值存在于 file2 中,则将 file1 中的所有行值添加到 file2

我有两个文件

文件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 中,我需要将 FileA 中的所有行值添加到 FileB,即使该匹配值在 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

我可以使用 pandas 在 Python 中执行此操作,但很想找到一种使用 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

您可以简单地使用连接两个文件加入(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)。这-o只是为了适合您的示例输出。如果您希望输出在漂亮的列中,请将输出通过管道传输到column -t

相关内容