このようなファイルがあります。
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