コンマで区切られたフィールドの1行を、それぞれ特定の数のフィールドを含む複数行に分割する方法は?

コンマで区切られたフィールドの1行を、それぞれ特定の数のフィールドを含む複数行に分割する方法は?

このようなファイルがあります。

Hello,Hi,Hullo,Hammers,Based,Random

の場合、n=2出力は次のようになります。

Hello,Hi
Hullo,Hammers
Based,Random

の場合、n=3出力は次のようになります。

Hello,Hi,Hullo
Hammers,Based,Random

これを行うためにawk / sedをどのように使用できますか?

編集:nフィールド数は要素です。

答え1

$ awk -v n=2 -F',' '{for (i=1;i<=NF;i++) printf "%s%s", $i, (i%n ? FS : ORS)}' file
Hello,Hi
Hullo,Hammers
Based,Random

$ awk -v n=3 -F',' '{for (i=1;i<=NF;i++) printf "%s%s", $i, (i%n ? FS : ORS)}' file
Hello,Hi,Hullo
Hammers,Based,Random

お客様の質問では、フィールド数が分割できない場合の処理​​方法については説明していないnため、ここでも説明していません。

答え2

sumを使用する別のtr方法paste

n=2の場合、

$ <input tr ',' '\n' | paste  -d ',' - -
Hello,Hi
Hullo,Hammers
Based,Random

n=3の場合、

$ <input tr ',' '\n' | paste  -d ',' - - -
Hello,Hi,Hullo
Hammers,Based,Random

答え3

パールの使用:

$ echo 'Hello,Hi,Hullo,Hammers,Based,Random' | 
    perl -F, -le '
      BEGIN { $n = shift };
      for ($i=0; $i < @F; $i += $n) {
         print join(",", @F[$i .. ($i + $n - 1)]);
      }' 2
Hello,Hi
Hullo,Hammers
Based,Random

これは、最初の引数を出力行ごとに印刷する項目の数として使用します(変数を使用$n)。 STDINおよびすべてのファイル名パラメーターが入力として使用されます。

-F,そのオプション(暗黙的に有効化-aとオプション)のため、-n各入力行を自動的に読み取り、コンマで区切って配列にし、配列の @Fインデックスを一度に1つずつ繰り返します。要素は各出力ラインに印刷されます。$n$n

注:使用テキスト::CSV単純なカンマ区切り入力ではなく引用符で囲まれたフィールドと、引用符に含まれるカンマを使用して実際のCSVを解析する必要がある場合は、モジュールを使用してください。

3代わりに、出力パラメータは次のとおりです2

$ echo 'Hello,Hi,Hullo,Hammers,Based,Random' | perl -F, -le 'BEGIN{$n = shift};for($i=0;$i<@F;$i+=$n){print join(",",@F[$i..($i+$n-1)])}' 3
Hello,Hi,Hullo
Hammers,Based,Random

Re 4:

$ echo 'Hello,Hi,Hullo,Hammers,Based,Random' | perl -F, -le 'BEGIN{$n = shift};for($i=0;$i<@F;$i+=$n){print join(",",@F[$i..($i+$n-1)])}' 4
Hello,Hi,Hullo,Hammers
Based,Random,,

答え4

awk戻り値とnewlinesで
区切られた値のセットを入力し、固定幅csvを出力します。,

awk '{printf((FNR>1?(FNR-1)%n?",":ORS:"")$0)}END{print ""}' RS='[,\n]' n=4 <<END
Hello
Hi,Hullo,Hammers,Based
Random
END

Hello,Hi,Hullo,Hammers
Based,Random

関連情報