1つの行を3列の複数の行に分割する方法があります。ファイル内のすべての行の終わりに改行文字がありません。
Awkを使用してみましたが、各行が3列ではなく1列に分割されています。
awk '{ gsub(",", "\n") } 6' filename
filename
のコンテンツは次のようになります。
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
必要な出力は、各行に3つの列があります。
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
awk
の使用_$ awk -v RS='[,\n]' '{a=$0;getline b; getline c; print a,b,c}' OFS=, filename
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
_
_-v RS='[,\n]'
_
これはawkに、コンマまたは改行の出現をレコード区切り文字として使用するように指示します。
_a=$0; getline b; getline c
_
これにより、awkは現在の行を変数a
に保存し、次の行を変数b
に保存し、その次の行を変数c
に保存します。
_print a,b,c
_
これはawkにa
、b
、およびc
を出力するように指示します
_OFS=,
_
これは、出力のフィールド区切り文字としてコンマを使用するようにawkに指示します。
tr
およびpaste
の使用_$ tr , '\n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
_
_tr , '\n' <filename
_
これは、すべてのコンマを改行に変換しながら、ファイル名から読み取ります。
_paste -d, - - -
_
これはpaste
で、標準入力から3行(_-
_ごとに1行)を読み取り、それらをコンマで区切って貼り付けます(_-d,
_)。
_$ awk -v RS='[,\n]' '{printf "%s%s",$0,(NR%3?",":"\n")}' filename
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
_
_-v RS='[,\n]'
_
これはawkに、コンマまたは改行の出現をレコード区切り文字として使用するように指示します。
printf "%s%s",$0,(NR%3?",":"\n")
これは、現在の行番号、NR
、モジュロ3の値に応じて、現在の行の後にコンマまたは改行が続くようにawkに指示します。
_sed 's/\(\([^,]\+,\)\{3\}\)/\1\n/g;s/,\n/\n/g' filename
_
あなたがawk
ソリューションを要求したことを知っているので、これをこの回答の編集として送信しようとしますが、私にとってはsed
ソリューションの方が簡単でした... ...そして、ユーザーjohn1024が私に打ち勝ちました。すばらしいawk
ソリューションです。そこを見て。彼のpaste
およびtr
ソリューションは、おそらく最も適切な古典的なUNIX風の答えです。
このソリューションは、GNU sed。の拡張正規表現機能を使用します。
\(..\)
は、正規表現コレクショングループです。ソリューションは2つを使用することに注意してください。
_[^,]+,
_は、コンマの後にコンマが続いていない文字列です。あなたの場合、列またはフィールド。
_\{3\}
_は、以前の正規表現を3回使用することを示す正規表現の乗数です。
_\1
_は正規表現の後方参照です。以前の正規表現に。
g
は、行のすべてのインスタンスに対して実行することを意味します。
_s/,\n/\n/g
_は、末尾のコンマを削除します。 sed
は入力を単一行と見なしているため、ここに改行文字を含める必要があります。