Bash

AWK 比較來自兩個文件的列 1 列印將列附加到輸出中的第三列

  • March 22, 2017

希望比較具有相同格式的兩個輸入文件的第一列。格式如下所示:

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

第 1 列包含 FILE1 和 FILE2 中的 MAC 地址。我希望 FILE1 中的第 1 列的值與 FILE2 中的第 1 列進行檢查,並且是否存在匹配以輸出 FILE1 的第 1 列和第 2 列的值以及 FILE2 中的第 2 列的值作為第三列以這種方式。

DESIRED OUTPUT:
0000abc5abc3 GR096 GR097
0000def5ae87 GR001 GR001
0000cba5b187 GR001 GR169

每個文件包含數百萬個條目。使用 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

awk 對我來說使用數組要快得多,但我無法使用如下語法將 FILE2 的第二列列印到輸出的第三列中。此語法僅第二次列印第 2 列:

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

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

摘要:如果在file2中找到file1中Column 1的值,則列印出column 1、column 2(File1)和column2(File2)的值。

如果輸出可以排序:

join <(sort file1.txt) <(sort file2.txt)

只是為了糾正你的awk:

awk 'NR==FNR { n[$1]=$0;next } ($1 in n) { print n[$1],$2 }' file1 file2

#Output:
0000abc5abc3 GR096 GR097 
0000def5ae87 GR001 GR001 
0000cab5aea3 GR001 GR001 
0000bac5aeeb GR001 GR001 
0000fed5af13 GR001 GR123 
0000cba5b187 GR001 GR169 

引用自:https://unix.stackexchange.com/questions/353174