以下のファイルがあります。Test.csv
"pav",12345,"ABCD,EF;xyz23;15rtg",,
"xyz",,"C4DEF;x23yu;rtg",,
修正後:
cat Test.csv
"pav",12345,"AB;xy;15",,
"xyz",,"C4;x2;rt",,
これサム""で区切られた部分文字列を含むrdフィールドは、その部分;
文字列で置き換える必要があります。
ベストアンサー1
以下が使用されますcsvkit
参照フィールドにカンマを含むCSVデータを直接解析すると、awk
エラーが発生しやすいためです。
これにより、正しい形式の3番目の列が生成されます。
csvcut -c 3 file.csv |
sed -r 's/^"|"$//g' |
awk -F';' -vOFS=';' '{ for (i=1; i<=NF; ++i) $i = substr($i, 0, 2) } { printf("\"%s\"\n", $0) }' >tmp-3rd
与えられた入力に対して、これは以下を生成します。
"AB;xy;15"
"C4;x2;rt"
csvcut
3番目の列が切り捨てられます。sed
すべての二重引用符が行の最初または最後に表示されると、データから削除されます。- プログラムは、区切りフィールドを
awk
繰り返してフィールド;
ごとに2文字の長さに短縮します。二重引用符でデータを印刷します。 - 出力はファイルに書き込まれます
tmp-3rd
。
次に、元のデータに再組み立てします(これは、手続き型置換をbash
実行するために使用できる別のシェルであると仮定します<(...)
)。
paste -d, <( csvcut -c 1,2 file.csv ) tmp-3rd <( csvcut -c 4,5 file.csv ) | csvformat
paste
列はカンマで区切られ、一緒にグループ化されます。- 最初のプロセスは元のファイルの最初の2つの列を置き換え、2番目のプロセスは最後の2つの列を置き換えます。中央には、修正された3番目の列があります。
csvformat
オプションのステップとして、必要に応じてフィールドを参照または逆参照してデータを渡します。
出力は次のとおりです
pav,12345,AB;xy;15,,
xyz,,C4;x2;rt,,
一時ファイルの必要性をバイパスします。
paste -d, \
<( csvcut -c 1,2 file.csv ) \
<( csvcut -c 3 file.csv | sed -r 's/^"|"$//g' |
awk -F';' -vOFS=';' '{ for (i=1; i<=NF; ++i) $i = substr($i, 0, 2) } { printf("\"%s\"\n", $0) }' ) \
<( csvcut -c 4,5 file.csv ) | csvformat