次の入力が与えられました。
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
使用bash
とcsvformat
csvkit
フィールド区切り文字をコンマから改行セットに変更します。
$ csvformat -D $'\n' file
field1
field2
field3
field4
これは、入力file
CSVが正しい形式であると仮定します。また、埋め込みコンマを正しく処理します。
$ cat file
"field,1",field2,field3,field4
$ csvformat -D $'\n' file
field,1
field2
field3
field4