awk 2つの列の値が一致すると、file2からfile1の列値を取得します。

awk 2つの列の値が一致すると、file2からfile1の列値を取得します。

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

2つの質問があります。まず、タイプミスがあります。

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

この行は4行にはありますが、3行にはないD1110ため機能しません。したがって、次のような他のアプローチが必要です。D1110filefile2

$ 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

おすすめ記事