AWKを使用して区切り文字を使用して行の内容を複数行に分割する方法

AWKを使用して区切り文字を使用して行の内容を複数行に分割する方法

次の入力が与えられました。

field1,field2,field3,field4

私はこのような出力を得たい

field1
field2
field3
field4

awkを使ってこれを行うにはどうすればよいですか?

答え1

Awkの慣用的な方法は次のとおりです。

awk 'BEGIN{FS=","; OFS="\n"} {$1=$1} 1'

または等しく

awk '{$1=$1} 1' FS=, OFS='\n'

新しい区切り文字を使用してレコードを強制的{$1=$1}に再評価OFSし、1基本print操作をトリガーします。必要に応じて、他の表現(たとえばNF += 0)を使用して再評価を強制できます。これは優先事項の問題です。

迅速で汚い方法は

awk -vRS=, 1

(またはawk 1 RS=,)カンマで区切られた各単語を完全なレコードとして扱い、デフォルトの改行レコード区切り文字を使用して出力します。

答え2

使用ティーカンマを改行文字に変換します。

echo "field1,field2,field3,field4" | tr "," "\n"

これはおそらくを使用するよりも高速ですawkが、必要に応じて次のようにできます。

echo "field1,field2,field3,field4" | awk '{gsub(",","\n");print}'

~からGNU awkドキュメント:

gsub(正規表現、置換[、対象])

検索可能な最も長く、最も左側にあり、重複しない一致するすべての部分文字列をターゲットで検索し、それを代替文字列に置き換えます。 gsub() の「g」は「global」を意味し、どこでも置換を意味します。

答え3

使用bashcsvformatcsvkitフィールド区切り文字をコンマから改行セットに変更します。

$ csvformat -D $'\n' file
field1
field2
field3
field4

これは、入力fileCSVが正しい形式であると仮定します。また、埋め込みコンマを正しく処理します。

$ cat file
"field,1",field2,field3,field4
$ csvformat -D $'\n' file
field,1
field2
field3
field4

関連情報