web-dev-qa-db-ja.com

1行を複数行に分割し、入力ファイルのすべての行で改行文字が欠落している

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
4
Rakesh K

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にab、および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

_$ 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に指示します。

9
John1024
_sed 's/\(\([^,]\+,\)\{3\}\)/\1\n/g;s/,\n/\n/g' filename
_

あなたがawkソリューションを要求したことを知っているので、これをこの回答の編集として送信しようとしますが、私にとってはsedソリューションの方が簡単でした... ...そして、ユーザーjohn1024が私に打ち勝ちました。すばらしいawkソリューションです。そこを見て。彼のpasteおよびtrソリューションは、おそらく最も適切な古典的なUNIX風の答えです。

  1. このソリューションは、GNU sed。の拡張正規表現機能を使用します。

  2. \(..\)は、正規表現コレクショングループです。ソリューションは2つを使用することに注意してください。

  3. _[^,]+,_は、コンマの後にコンマが続いていない文字列です。あなたの場合、列またはフィールド。

  4. _\{3\}_は、以前の正規表現を3回使用することを示す正規表現の乗数です。

  5. _\1_は正規表現の後方参照です。以前の正規表現に。

  6. gは、行のすべてのインスタンスに対して実行することを意味します。

  7. _s/,\n/\n/g_は、末尾のコンマを削除します。 sedは入力を単一行と見なしているため、ここに改行文字を含める必要があります。

5
user1404316