AWK 比较两个文件中的第 1 列打印将列附加到输出中的第三列

drf*_*ein 0 bash array awk shell-script associative-array

希望比较具有相同格式的两个输入文件的第一列。格式如下所示:

FILE1:
0000abc5abc3 GR096
0000def5ae87 GR001
0000cab5aea3 GR001
0000bac5aeeb GR001
0000fed5af13 GR001
0000efd5b16f GR001
0000cba5b187 GR001
0000bca5b2a3 GR001

FILE2:
0000abc5abc3 GR097
0000def5ae87 GR001
0000cab5aea3 GR001
0000bac5aeeb GR001
0000fed5af13 GR123
0000cba5b187 GR169
Run Code Online (Sandbox Code Playgroud)

第 1 列包含 FILE1 和 FILE2 中的 MAC 地址。我希望 FILE1 中第 1 列的值与 FILE2 中的第 1 列进行检查,并且是否存在匹配以将 FILE1 的第 1 列和第 2 列的值以及 FILE2 中第 2 列的值输出为这种方式的第三列。

DESIRED OUTPUT:
0000abc5abc3 GR096 GR097
0000def5ae87 GR001 GR001
0000cba5b187 GR001 GR169
Run Code Online (Sandbox Code Playgroud)

每个文件包含数百万个条目。使用 while 循环在 bash 中运行输入永远缓慢且低效,因为它会循环每个条目:

while read -r mac1 code1; do
    while read -r mac2 code2 ; do
        if [ "$mac1" == "$mac2" ]; then
            printf "%s %s %s\n" "$mac1" "$code1" "$code2"
        fi
    done < "$FILE1"
done < "$FILE2" > OUTPUTFILE
Run Code Online (Sandbox Code Playgroud)

Awk 对我来说使用数组要快得多,但我无法使用如下语法将 FILE2 的第二列打印到输出的第三列中。此语法仅第二次打印第 2 列:

awk 'NR==FNR { n[$1] = $1; n[$2] = $2; next } ($1 in n) { print n[$1],n[$2],$2 }'
Run Code Online (Sandbox Code Playgroud)

我的偏好是 AWK,但如果它可以在 bash 中以同样快的速度运行,我也可以接受。

总结:如果file1中Column 1的值在file2中找到,则打印column 1、column 2 (File1)和column2 (File2)的值。

sla*_*100 5

如果输出可以排序:

join <(sort file1.txt) <(sort file2.txt)
Run Code Online (Sandbox Code Playgroud)