Awk

比較兩個文件的第一列,如果第一列匹配,則列印第二個文件的整行

  • May 22, 2018

我有兩個這些格式的文件:

文件 1:

air
smell
hand
dude
road
cat

文件 2:

air,4,21,01,13,3,2
smell,21,4,2,5,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1
hand,1,4,2,1,6
mouse,1,3,5,6,2

我想要做的是列印文件 2 的整行,如果在文件 1 中找到文件 2 的第 1 列中的第一個字元串,並且我想保持文件 1 的順序。

預期輸出:

air,4,21,01,13,3,2
smell,21,4,2,5,6
hand,1,4,2,1,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1

這應該這樣做:

awk -F, 'FNR==NR {a[$1]; next}; $1 in a' file1 file2

編輯:

為訂購解釋了錯誤的文件。新的嘗試(gawk如果可以接受,則需要)

gawk -F, '
   FNR==NR {a[NR]=$1; next}; 
   {b[$1]=$0}
   END{for (i in a) if (a[i] in b) print b[a[i]]}
' file1 file2

編輯2:

使用 nowmalawk並交換文件:

awk -F, 'FNR==NR {a[$1]=$0; next}; $1 in a {print a[$1]}' file2 file1
join -t, -1 2 -2 1 <(nl -s, -ba -nrz file1 | sort -t, -k2) \
<(sort -t, -k1 file2) | sort -t, -k2 | cut -d, -f1,3-

中的行file1已編號,結果sort在第二個欄位中。然後joinfile2( sorted on 1st field) 編輯:

air,000001,4,21,01,13,3,2
cat,000006,1,5,6,3,1
dude,000004,1,31,42,1
hand,000003,1,4,2,1,6
road,000005,1,4,2,1,4
smell,000002,21,4,2,5,6

然後sort在第二個欄位(即行號)上編輯結果以恢復原始行順序,然後刪除相同的第二個欄位cut

air,4,21,01,13,3,2
smell,21,4,2,5,6
hand,1,4,2,1,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1

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