特定の文字列を見つけて、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
答え1
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
答え2
awk -F, '{gsub("SAMS CLUB","SAM'\''S CLUB",$3);print}' filename1 > filename2
かなり近づきました。 2つの部分がありません。
- 入力を
-F,
カンマ()に基づいてフィールドに分割するようにawkに指示します。 - 代替テキストに一重引用符を入れる
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}
答え3
もう一つの短い話アッ解決策:
awk -F, '$3~"SAMS CLUB"{sub("S ","\047S ",$3)}1' OFS=',' filename1 > filename2