匹配数据以纠正 awk 中两个文件的 ID

Bor*_*sRu 1 shell awk

我正在尝试合并来自两个不同文件的数据。在每个文件中,一些数据与一些 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

bob*_*lan 6

它必须是 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 的极好建议,您可以在之后保留输出。

  • 你甚至可以按照OP想要的方式通过管道传输到像“|”这样的列来格式化输出 列 -t -s' ' -o' '` (3认同)