Address.csv와 ZipCode.txt라는 두 개의 파일이 있습니다. 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
스크립트에서 변경해야 할 주요 사항은 첫 번째 필드의 처음 5자를 가져오는 함수를 사용하는 것입니다 substr
.
내부 데이터 Address.csv
가 일치하지 않습니다. 처음 두 데이터 라인에는 5개의 필드가 있고 다른 데이터 라인에는 6개의 필드가 있습니다. 이것이 바로 (네 번째 필드) $(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