Awk: 引用した場合は、列を連結してコンマを削除します。

Awk: 引用した場合は、列を連結してコンマを削除します。

私は次のデータを持っています:

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"""

おすすめ記事