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

두 가지 질문이 있습니다. 첫째, 오타가 있습니다.

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

답변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

관련 정보