カンマ区切りファイルには、値にカンマが含まれています。

カンマ区切りファイルには、値にカンマが含まれています。

次のデータを含むファイルがあります。

“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オプションを使用すると、mlrCSV データを入出力し、-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列目のカンマだけでなく、チルダにもカンマを挿入します。

結果を新しい名前にリダイレクトしてファイルに保存します。

おすすめ記事