我正在尝试合并来自两个不同文件的数据。在每个文件中,一些数据与一些 ID 相关联。我想“组合”这两个文件,因为所有ID 都必须打印到一个新文件中,并且来自两个文件的数据必须与 ID 正确匹配。例子:
cat file_1
1.01 data_a
1.02 data_b
1.03 data_c
1.04 data_d
1.05 data_e
1.06 data_f
Run Code Online (Sandbox Code Playgroud)
cat file_2
1.01 data_aa
1.03 data_cc
1.05 data_ee
1.09 data_ii
Run Code Online (Sandbox Code Playgroud)
想要的结果是:
cat files_combined
1.01 data_a data_aa
1.02 data_b
1.03 data_c data_cc
1.04 data_d
1.05 data_e data_ee
1.06 data_f
1.09 data_ii
Run Code Online (Sandbox Code Playgroud)
我知道如何通过循环遍历每个 ID 以漫长而缓慢的方式来完成。一些伪代码示例:
awk -F\\t '{print $1}' file_1 > files_combined
awk -F\\t '{print $1}' file_2 >> files_combined
sort -u -n files_combined > tmp && mv tmp files_combined
count=0
while read line; do
count++
ID=$line
value1=$(grep "$ID" file_1 | awk -F\\t '{print $2}')
value2=$(grep "$ID" file_2 | awk -F\\t '{print $2}')
awk -F\\t 'NR=='$count' {$2='$value1' && $3='$value2'} 1' OFS="\t" files_combined > tmp && mv tmp files_combined
done < files_combined
Run Code Online (Sandbox Code Playgroud)
这对一个有 10 行的文件完成了这项工作,但是对于 100000 行,它只需要太长时间。我只是在寻找毫无疑问的神奇 awk 解决方案。
鲍勃·迪伦提供的解决方案:
join -j -a 1 -a 2 -t $'\t' -o auto file_1 file_2
它必须是 awk,还是您选择它是因为您认为这是最好的 - 最简单的方法?
你可以通过加入来做到这一点
$join -j 1 -a 1 -a 2 -o auto file_1 file_2 | column -t -s' ' -o' '
1.01 data_a data_aa
1.02 data_b
1.03 data_c data_cc
1.04 data_d
1.05 data_e data_ee
1.06 data_f
1.09 data_ii
Run Code Online (Sandbox Code Playgroud)
编辑:根据 KamilCuk 的极好建议,您可以在之后保留输出。