Awk

如果值在 2 列中匹配,則 awk 從文件 2 獲取文件 1 的列值

  • June 24, 2022

我有 2 個文件,當它們的列匹配時,嘗試將從 file2 獲取的列值設置為 file1

file1:
signup||20200620|A3332|en|LA||ACTIVE
signup||20200620|B4443|en|CA|66001|ACTIVE
signup||20200620|C2221|en|WC||ACTIVE
signup||20200620|D1110|en|LA||ACTIVE
signup||20200620|E5554|en|WC|66003|ACTIVE

file2:
A3332||99001
B4443|66001|99003
D1110|66004|99007
E5554||99004

標準: $ 4 of file1 must match $ file2的1,匹配後應該設置 $ 7 of file1 equal to $ 文件 2 的 3


期望:

signup||20200620|A3332|en|LA|99001|ACTIVE
signup||20200620|B4443|en|CA|99003|ACTIVE
signup||20200620|C2221|en|WC||ACTIVE
signup||20200620|D1110|en|LA|99007|ACTIVE
signup||20200620|E5554|en|WC|99004|ACTIVE

我正在嘗試什麼

awk 'BEGIN{ FS=OFS="|" } NR==FNR{a[NR]=$1; b[NR]=$3; next} {if (a[FNR] = $4); $7=b[FNR]; print}' file2 file1

我得到了什麼

signup||20200620|A3332|en|LA|99001|ACTIVE
signup||20200620|B4443|en|CA|99003|ACTIVE
signup||20200620|C2221|en|WC|99007|ACTIVE
signup||20200620|D1110|en|LA|99004|ACTIVE
signup||20200620|E5554|en|WC||ACTIVE

如果這是邏輯錯誤或其他原因,我會摸不著頭腦

有兩個問題。首先,你有一個錯字:

if (a[FNR] = $4)

這將始終是正確的,因為您使用=的是賦值運算符而不是==比較。你需要:

if (a[FNR] == $4)

下一個問題是文件中的行數不同。因此,即使您修復了錯字,它也不會按預期工作:

$ awk 'BEGIN{ FS=OFS="|" } NR==FNR{a[NR]=$1; b[NR]=$3; next} {if (a[FNR] == $4){$7=b[FNR]}; print}' file2 file1
signup||20200620|A3332|en|LA|99001|ACTIVE
signup||20200620|B4443|en|CA|99003|ACTIVE
signup||20200620|C2221|en|WC||ACTIVE
signup||20200620|D1110|en|LA||ACTIVE
signup||20200620|E5554|en|WC|66003|ACTIVE

D1110行不工作,因為D1110在第 4file行但在第 3 行file2。所以你需要一種不同的方法,像這樣:

$ awk 'BEGIN{ FS=OFS="|" } NR==FNR{a[$1]=$3; next} {if ($4 in a){$7=a[$4]}; print}' file2 file1
signup||20200620|A3332|en|LA|99001|ACTIVE
signup||20200620|B4443|en|CA|99003|ACTIVE
signup||20200620|C2221|en|WC||ACTIVE
signup||20200620|D1110|en|LA|99007|ACTIVE
signup||20200620|E5554|en|WC|99004|ACTIVE

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