AWK, substitua o valor do campo combinando campos em dois arquivos

AWK, substitua o valor do campo combinando campos em dois arquivos

Tenho 2 arquivos Address.csv e ZipCode.txt, quero gerar um arquivo semelhante ao Address.csv e atualizar o campo cidade de "cidade" para "encontrado" quando o CEP corresponder aos 5 primeiros caracteres do CEP no arquivo Endereço.csv.

O que eu tenho:

  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

O que eu quero:

  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

O que tentei com a ajuda do Simlevawk substitui o valor do campo com base no valor correspondente em outro arquivo:

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

Responder1

A principal coisa que deve ser alterada no seu script é obter os 5 primeiros caracteres do primeiro campo usando function substr.

Os dados Address.csvsão inconsistentes. As duas primeiras linhas de dados possuem 5 campos, as demais possuem 6 campos. É por isso que uso $(NF-1)(penúltimo campo) em vez de $4(4º campo). Caso contrário, os campos errados serão alterados com seus dados de exemplo.

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

Isso imprime

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

informação relacionada