![如果 file1 中的列值存在于 file2 中,则将 file1 中的所有行值添加到 file2](https://linux22.com/image/167131/%E5%A6%82%E6%9E%9C%20file1%20%E4%B8%AD%E7%9A%84%E5%88%97%E5%80%BC%E5%AD%98%E5%9C%A8%E4%BA%8E%20file2%20%E4%B8%AD%EF%BC%8C%E5%88%99%E5%B0%86%20file1%20%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E8%A1%8C%E5%80%BC%E6%B7%BB%E5%8A%A0%E5%88%B0%20file2.png)
我有两个文件
文件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