次のデータを含むファイルがあります。
“A”,”Dept1”,”i am mahesh,working in it”,”1”
“B”,”Dept2”,”i am suresh, working in non it”,”2”
私が望む出力は次のとおりです。
A,Dept1,i am mahesh~working in it,1
B,Dept2,i am suresh~working in non it,2
以下で試しましたが、次のようにすべて〜に置き換えられます。
awk -F ‘“,”’ -v OFS=‘’ ‘{for (i=0;i<=NF;++i) gsub(“,”,”~”,$i)}1’ file
“A”~”Dept1”~”i am mahesh~working in it”~”1”
“B”~”Dept2”~”i am suresh~working in non it”~”2”
答え1
構造化文書形式で作業する場合は、汎用テキスト処理ツールではなく、特定の形式を理解するツールを使用してください。
CSVファイルで参照されているフィールドには、「単純」と知られていない場合を除き、コンマと改行を含めることができます。引用符付きフィールドの引用符は2倍になります(""
)。
埋め込みコンマをチルダ(~
)に変更するには、次のCSVをサポートするツールを使用するのが最善です。MLR(ミラー)またはcsvkit。
"
以下では、質問テキストに使用した二重引用符()ではなく、二重引用符()を引用符で囲んでいます”
。
mlr
これは、さまざまな構造化形式を認識する便利なツールである3番目のフィールドを変換するために使用されます。
$ mlr --csv -N put '$3=sub($3,",","~")' file
A,Dept1,i am mahesh~working in it,1
B,Dept2,i am suresh~ working in non it,2
この--csv
オプションを使用すると、mlr
CSV データを入出力し、-N
データにヘッダーがないことをユーティリティに通知します。その後、「動詞」(アクション)を適用し、put
慣れている場合はおなじみの表現を提供しますawk
(引数の順序sub()
は異なりますが)。
(csvkit で) を使用すると、csvformat
変更するコンマを見つけやすくするためにデータ型を再指定できます。
@
まず、区切り文字を(まだデータに属していないすべての文字)に変更します。
$ csvformat -D '@' file
A@Dept1@i am mahesh,working in it@1
B@Dept2@i am suresh, working in non it@2
tr
その後、次を使用して残りのカンマをチルダに簡単に変更できます。
$ csvformat -D '@' file | tr ',' '~'
A@Dept1@i am mahesh~working in it@1
B@Dept2@i am suresh~ working in non it@2
次に、次のコマンドを再度使用して、区切り文字をコンマに戻しますcsvformat
。
$ csvformat -D '@' file | tr ',' '~' | csvformat -d '@'
A,Dept1,i am mahesh~working in it,1
B,Dept2,i am suresh~ working in non it,2
このように変更されます。みんな3列目のカンマだけでなく、チルダにもカンマを挿入します。
結果を新しい名前にリダイレクトしてファイルに保存します。
答え2
sed
a)二重引用符の間に表示されるカンマをチルダ以外に変更し、b)すべての二重引用符を削除します。
sed 's/\([^"]\),\([^"]\)/\1~\2/g;s/"//g' infile
結果が良い場合は、-i
ファイルを適切な場所に置き換えるために使用されます。
家庭みんなフィールドは使用前に引用符で囲みます。