AWK, заменить значение поля, сопоставив поля в двух файлах

AWK, заменить значение поля, сопоставив поля в двух файлах

У меня есть 2 файла Address.csv и ZipCode.txt. Я хочу создать файл, аналогичный Address.csv, и обновить поле города с «city» на «found», если почтовый индекс совпадает с первыми 5 символами почтового индекса в файле 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

Что я пробовал с помощью Simlevawk заменяет значение поля на основе соответствующего значения в другом файле:

  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(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

Связанный контент