web-dev-qa-db-ja.com

CSVファイルの列の文字列を一重引用符で別の文字列に置き換えます

特定の文字列を探して(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
2
Dhruuv

フィールドセパレータ(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
5
heemayl
awk -F, '{gsub("SAMS CLUB","SAM'\''S CLUB",$3);print}' filename1 > filename2

あなたは近かった-ちょうど2つの部分がありません:

  1. 入力をコンマ(-F,)、および
  2. 単一引用符を置換テキストに入れる

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}
2
Jeff Schaller

別の短いawkソリューション:

awk -F, '$3~"SAMS CLUB"{sub("S ","\047S ",$3)}1' OFS=',' filename1 > filename2
0
RomanPerekhrest