特定の文字列を探して(awkを使用して).CSVファイルの3番目の列の内容を置き換え、単一引用符が付いた別の文字列に置き換えて、その出力を別のファイルにコピーしたいと思います。私が間違っていることについて何かアドバイスはありますか?
例えば:
column1, coluumn2, coulumn3, column4, column5
1, item1, WALMART, 2.39, 50
2, item2, TARGET, 4.99, 52
3, item3, SAMS CLUB, 8.19, 15
4, item4, KROGER, 12.49, 33
5, item6, WEGMANS, 32.69, 75
6, item6, TARGET, 12.99, 25
7, item7, SAMS CLUB, 8.19, 92
私は以下のawkを使ってみましたが動作しません:
awk '{gsub("SAMS CLUB","SAM\'S CLUB",$3);print}' filename1 > filename2
フィールドセパレータ(FS
)を適切に設定する必要があります。デフォルトでは、awk
はフィールドの区切り文字として水平方向の空白を使用するため、SAMS
が1つのフィールドになり、CLUB
が別のフィールドになります。したがって、{gsub("SAMS CLUB","SAM\'S CLUB",$3);print}
は正常に機能しません。
できるよ:
awk -F ', +' '{gsub("SAMS CLUB","SAM'\''S CLUB",$3); print}' OFS=", " file.txt
-F ', +'
は、FS
をカンマとして設定し、その後に1つ以上のスペースを続けます。スペースがわからない場合は、代わりに文字クラス[:blank:]
を使用して水平の空白を表し、必要に応じてOFS
を変更してください。例:
% cat file.txt
column1, coluumn2, coulumn3, column4, column5
1, item1, WALMART, 2.39, 50
2, item2, TARGET, 4.99, 52
3, item3, SAMS CLUB, 8.19, 15
4, item4, KROGER, 12.49, 33
5, item6, WEGMANS, 32.69, 75
6, item6, TARGET, 12.99, 25
7, item7, SAMS CLUB, 8.19, 92
% awk -F ',[[:blank:]]+' '{gsub("SAMS CLUB","SAM'\''S CLUB",$3); print}' OFS=", " file.txt
column1, coluumn2, coulumn3, column4, column5
1, item1, WALMART, 2.39, 50
2, item2, TARGET, 4.99, 52
3, item3, SAM'S CLUB, 8.19, 15
4, item4, KROGER, 12.49, 33
5, item6, WEGMANS, 32.69, 75
6, item6, TARGET, 12.99, 25
7, item7, SAM'S CLUB, 8.19, 92
awk -F, '{gsub("SAMS CLUB","SAM'\''S CLUB",$3);print}' filename1 > filename2
あなたは近かった-ちょうど2つの部分がありません:
-F,
)、およびAwkスクリプトは単一引用符で囲まれているため、そのための1つの方法は、単一引用符で囲まれたテキストを終了し、(エスケープされた)単一引用符を挿入してから、単一引用符で囲まれたテキストを再開することです。別の方法は変数を使用することです:
awk -F, -v old="SAMS CLUB" -v new="SAM'S CLUB" '{gsub(old,new,$3);print}' filename1 > filename2
さらに別の方法は、ENVIRON
配列変数を使用することです。
old="SAMS CLUB"
new="SAM'S CLUB"
export old new
awk -F, '{gsub(ENVIRON["old"], ENVIRON["new"], $3);print}'
さらに別の方法として、awkスクリプトをファイルに保存し、次のように呼び出します。
awk -F, -f awk-script-filename filename1 > filename2
スクリプトファイルを使用すると、引用符を簡略化できます。
{gsub("SAMS CLUB","SAM'S CLUB",$3);print}
別の短いawkソリューション:
awk -F, '$3~"SAMS CLUB"{sub("S ","\047S ",$3)}1' OFS=',' filename1 > filename2