AWK, 두 파일의 필드를 일치시켜 필드 값 바꾸기

AWK, 두 파일의 필드를 일치시켜 필드 값 바꾸기

Address.csv 및 ZipCode.txt 파일이 2개 있습니다. Address.csv와 유사한 파일을 생성하고 우편번호가 우편번호의 처음 5자와 일치할 때 도시 필드를 "city"에서 "found"로 업데이트하고 싶습니다. Address.csv 파일에 있습니다.

내가 가진 것:

  Address.csv
  Zip,Address1,Address2,conty,city,state
  65432-3421,115 main st,atlantic,city,new jersey
  45678-4098,654 2nd st n.,bergin,city,new jersey
  23456-3425,4215 1st st. s.,suite a2,camden,city,new jersey
  12345-6278,3587 main st,apt j1,essex,city,new jersey

  ZipCode.txt
  23456
  12345
  34567
  45678

내가 원하는 것:

  NewAddress.csv
  Zip,Address1,Address2,conty,city,state
  65432-3421,115 main st,atlantic,city,new jersey
  45678-4098,654 2nd st n.,bergin,found,new jersey
  23456-3425,4215 1st st. s.,suite a2,camden,found,new jersey
  12345-6278,3587 main st,apt j1,essex,found,new jersey

Simlev의 도움으로 시도한 것awk는 다른 파일의 일치하는 값을 기반으로 필드 값을 바꿉니다.:

  awk -F, -v OFS="," 'NR==FNR {a[$1]++;next} $1 in a {$4="found"} 1' ZipCode.txt Address.csv     

답변1

스크립트에서 변경해야 할 주요 사항은 function 을 사용하여 첫 번째 필드의 처음 5자를 가져오는 것입니다 substr.

의 데이터 Address.csv가 일치하지 않습니다. 처음 두 데이터 라인에는 5개의 필드가 있고 나머지는 6개의 필드가 있습니다. 이것이 바로 (4번째 필드) $(NF-1)대신 (마지막에서 다음 필드)를 사용하는 이유입니다 $4. 그렇지 않으면 예제 데이터로 잘못된 필드가 변경됩니다.

awk -F, -v OFS="," 'NR==FNR {a[$1]++;next} substr($1,1,5) in a {$(NF-1)="found"} 1' ZipCode.txt Address.csv

이 인쇄

Zip,Address1,Address2,conty,city,state
65432-3421,115 main st,atlantic,city,new jersey
45678-4098,654 2nd st n.,bergin,found,new jersey
23456-3425,4215 1st st. s.,suite a2,camden,found,new jersey
12345-6278,3587 main st,apt j1,essex,found,new jersey

관련 정보