あるファイルのフィールドが別のファイルにあることを確認し、最初のファイルの特定の列を更新します。

あるファイルのフィールドが別のファイルにあることを確認し、最初のファイルの特定の列を更新します。

次の2つのファイルがあります。

a.txt(タブ区切り、列が3つ、行が多すぎます):

 city   plate   region
 istanbul   36  marmara
 trabzon    61  karadeniz

b.txt(カンマ区切り、4列、多すぎる行):

name,city,age,nationality
mehmet,trabzon,,
murat,istanbul,,
john,london,,

私が望むのは、city2番目の列(フィールド)が(最初の列 - )b.txtにあることを確認し、ファイルが存在する場合はファイルを更新し、4番目の列()を「トルコ語」に設定することです。したがって、予想される結果は次のとおりです。a.txtcitya.txtb.txtnationality

name,city,age,nationality
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,

次のコマンドを試しましたが、目的の出力が生成されませんでした。

nawk 'BEGIN { FS = "\t" } FNR == NR {x[$1] = $1; next;} {FS=OFS=","} FNR>1{if ($2 in x) {($4 = "turkish")} } 1' a.txt b.txt
name,city,age,nationality
mehmet,trabzon,,
murat,istanbul,,
john,london,,

私のコマンドでエラーを見つける必要があります。

答え1

スクリプトは正常に実行されます。私の考えでは、最初のファイルにタブの代わりに区切り文字でスペースがあるようです。

役に立たないものを取り除きBEGIN { FS = "\t" }、それが真であることを確認してください。

答え2

試してみてくださいsed

sed -n 's|\(.*\S\)\s\+[0-9].*|/\1/s/$/turkish/|p' a.txt |
sed -f - b.txt

答え3

使用awk(最初のファイルをa.txtメモリに完全にロードする必要があります):

awk -F"[\t, ]" 'FNR==NR&&NR!=1{a[$1]="turkish"}
  FNR!=NR{OFS=",";if(FNR!=1){$NF=a[$2]};print}' a.txt b.txt

  • -F"[\t,]"awks 区切り文字をタブとコンマに設定
  • FNR==NR&&NR!=1最初のファイルでのみ機能a.txtし、最初の行(ヘッダー)は無視します。
    • a[$1]="turkish"a最初のフィールドインデックスと呼ばれる配列に設定$1
  • FNR!=NR2番目のファイルでのみ機能します。b.txt
  • OFS=","出力フィールド区切り記号の設定
  • if(FNR!=1)ヘッダー行でない場合にのみ作業を実行してください。
  • $NF=a[$2]turkish最後のフィールドが配列に存在する場合は、以前に保存された値に設定します。
  • print値が存在するかどうかに応じて行を印刷します。

出力:

name,city,age,nationality
mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,

答え4

tr   -s \[:blank:] , <a.txt|    #dont mess with weird columns
cut  -d, -f1  |  sort -u   |    #drop all but unique first column entries
sed  -e's/[]*^\./$[]/\\&/g'\    #handle any regex metachars properly
     -e's/.*/^[^,]*,&,/'   |    #match only second column
grep -nf - -- b.txt        |    #get line numbers at head of matched lines
sed  -e's/:.*/be/'         |    #keep only matched line numbers + 'be'
sed  -f - -eb -e:e         \    #branch away or append turkish
     -e's/$/turkish/' -- b.txt

mehmet,trabzon,,turkish
murat,istanbul,,turkish
john,london,,

関連情報