引用符の間のコンマを変更せずに、コンマで区切られたものをセミコロンで区切ったものに変更するにはどうすればよいですか?

引用符の間のコンマを変更せずに、コンマで区切られたものをセミコロンで区切ったものに変更するにはどうすればよいですか?

次のようにカンマ区切りのファイルがあります。

123,456,"ABC,DEF"

ファイルをセミコロンで区切られたファイルに変更したいと思います。

123;456;"ABC,DEF"

次のコマンドを実行しましたが、残念ながら引用符の中の;も;に変更されました。これが起こらないようにするにはどうすればよいですか?

sed 's/,/;/g; s/\"//g; s/$/;^/' input.csv > output.csv

答え1

引用符の間のコンマを変更せずに、コンマで区切られたものをセミコロンで区切ったものに変更するにはどうすればよいですか?

あなたはそれを使用することができますcsvtool。多くのディストリビューション用にパッケージ化されています。正規表現を使用してcsv形式を処理するのは難しく、エラーが発生しやすいです。

$  csvtool -t ','   -u ';' col 1-  input.csv > output.csv

答え2

awk二重引用符をフィールド区切り文字として使用し、奇数,フィールド;(1、3、5など)のみを変更できます。

awk 'BEGIN{OFS=FS="\""} {for (i=1;i<=NF;i=i+2) gsub(/,/,";",$i)}1' file

;これには、フィールドが最初に入力されず、二重引用符内に埋め込み/エスケープがないなど、いくつかの仮定が行われましたが、"入力は例に示すように単純です。

より複雑な状況を処理するために、GNU awkは以下を提供します。FPAT 解決策csvファイルの場合、フィールドの改行などを除いて、ほとんどの場合うまく機能します。このcvsが例のように単純ではない場合は、cvs解析ライブラリを使用するプログラムが必要です。

答え3

FPATでGNU awkを使用する:

$ awk -v FPAT='[^,]*|"[^"]+"' -v OFS=';' '{$1=$1}1' file
123;456;"ABC,DEF"

必要に応じて参照してくださいhttps://stackoverflow.com/questions/45420535/whats-the-most-robust-way-to-efficiently-parse-csv-using-awk

関連情報