如果值在 2 列中匹配,则 awk 从文件 2 中获取文件 1 的列值

如果值在 2 列中匹配,则 awk 从文件 2 中获取文件 1 的列值

我有 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

标准: file1 的 $4 必须匹配 file2 的 $1,匹配后应设置 file1 的 $7 等于 file2 的 $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

如果这是逻辑错误还是其他什么问题,我会感到困惑

答案1

有两个问题。首先,你有一个错字:

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它位于 中的第 4 行file,但位于 中的第 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

答案2

也许格式化脚本将有助于逻辑:

awk -F\| '
NR == FNR       {A[$1] = $3; next}
($4 in A)       {$7 = A[$4]}
1' file2 OFS=\| 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

如果您仍然需要在第二个字段上进行匹配,那么您可以合并这些字段:

awk -F\| '
NR == FNR       {A[$1,$2] = $3; next}
($4,$7) in A    {$7 = A[$4,$7]}
1' file2 OFS=\| 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

相关内容