Bash
AWK 比較來自兩個文件的列 1 列印將列附加到輸出中的第三列
希望比較具有相同格式的兩個輸入文件的第一列。格式如下所示:
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