次の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,,
私が望むのは、city
2番目の列(フィールド)が(最初の列 - )b.txt
にあることを確認し、ファイルが存在する場合はファイルを更新し、4番目の列()を「トルコ語」に設定することです。したがって、予想される結果は次のとおりです。a.txt
city
a.txt
b.txt
nationality
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!=NR
2番目のファイルでのみ機能します。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,,