AWK、2 つのファイル内の一致するフィールドでフィールド値を置換する

AWK、2 つのファイル内の一致するフィールドでフィールド値を置換する

Address.csv と ZipCode.txt という 2 つのファイルがあり、Address.csv に似たファイルを生成し、Zipcode が Address.csv ファイル内の Zip の最初の 5 文字と一致する場合に、city フィールドを "city" から "found" に更新したいと考えています。

私が持っているもの:

  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矛盾しています。最初の 2 つのデータ行には 5 つのフィールドがあり、他の行には 6 つのフィールドがあります。そのため、 (4 番目のフィールド)$(NF-1)ではなく (最後から 2 番目のフィールド)を使用します$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

関連情報