私は次のデータを持っています:
COL1, COL2, COL3
a, b, c
d, "e,f,g", h
私はAwkがそれを次のように扱いたいと思います:
COL1, COL2, COL3
a, b, c
d, efg, h
カンマで区切られた各文字列は、任意の数の文字にすることができます。簡単にするために、ここでは単一の文字のみを使用しました。
これは正しく機能しません。
echo "COL1, COL2, COL3
a, b, c
d, "e,f,g", h" | awk -F ',' '{for (i=1; i<=NF; i++) gsub(/^"|"$|,/,"",$i); print}'
出力:
a, b, c
d "e f g h
ベストアンサー1
csvformat -S
(またはcsvformat --skipinitialspace
)を使用してください。csvkit各コンマの後の最初の空白文字を削除して、データを適切に引用符付きCSVレコードに変換します。それからミラー(mlr
)は各レコードの各フィールドを繰り返し、埋め込まれたコンマを削除します。
$ csvformat -S file | mlr --csv put 'for (k,v in $*) { $[k] = gsub(v,",","") }'
COL1,COL2,COL3
a,b,c
d,efg,h
どちらのツールもCSVをサポートし、引用符フィールド、カンマ挿入、改行挿入などを含むCSVレコードを読み取る方法を知っています。フィールドに引用符が必要な場合、csvkitツールとMillerは両方とも引用符付きフィールドを出力します。
たとえば、折り返しフィールドと引用符付きの他のフィールドを含むデータにレコードを追加します。
$ cat file
COL1, COL2, COL3
a, b, c
d, "e,f,g", h
My data, "Line 1,
Line 2", "This is a quote: ""The, quote"""
$ csvformat -S file | mlr --csv put 'for (k,v in $*) { $[k] = gsub(v,",","") }'
COL1,COL2,COL3
a,b,c
d,efg,h
My data,"Line 1
Line 2","This is a quote: ""The quote"""