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)的值。