7

bashでは、入力が与えられます

1
2
3
4
5
6
7
8
...

そしてN例えば5、私は出力が欲しい

1  6  11
2  7  12
3  8  ...
4  9
5  10 

どうすればよいですか?

4

3 に答える 3

14

あまり知られていない宝石を使用するpr:

$ seq 20 | pr -ts' ' --column 4
1 6 11 16
2 7 12 17
3 8 13 18
4 9 14 19
5 10 15 20
于 2013-01-25T10:19:11.360 に答える
4

次のスクリプトの5を自分の番号に置き換えます。

seq 20|xargs -n5| awk '{for (i=1;i<=NF;i++) a[i,NR]=$i; }END{
    for(i=1;i<=NF;i++) {for(j=1;j<=NR;j++)printf a[i,j]" "; print "" }}' 

出力:

1 6 11 16 
2 7 12 17 
3 8 13 18 
4 9 14 19 
5 10 15 20

上記の注意seq 20は、テスト用の数列を生成するためだけのものです。実際の仕事では必要ありません。

編集

sudo_Oで指摘されているように、純粋なawkソリューションを追加します。

 awk -vn=5 '{a[NR]=$0}END{ x=1; while (x<=n){ for(i=x;i<=length(a);i+=n) printf a[i]" "; print ""; x++; } }' file

テスト

kent$  seq 20| awk -vn=5 '{a[NR]=$0}END{ x=1; while (x<=n){ for(i=x;i<=length(a);i+=n) printf a[i]" "; print ""; x++; } }'     
1 6 11 16 
2 7 12 17 
3 8 13 18 
4 9 14 19 
5 10 15 20 

kent$  seq 12| awk -vn=5 '{a[NR]=$0}END{ x=1; while (x<=n){ for(i=x;i<=length(a);i+=n) printf a[i]" "; print ""; x++; } }'     
1 6 11 
2 7 12 
3 8 
4 9 
5 10 
于 2013-01-25T10:07:11.647 に答える
2

これが私がそれを行う方法ですawk

awk -v n=5 '{ c++ } c>n { c=1 } { a[c] = (a[c] ? a[c] FS : "") $0 } END { for (i=1;i<=n;i++) print a[i] }'

簡単なテスト:

seq 21 | awk -v n=5 '{ c++ } c>n { c=1 } { a[c] = (a[c] ? a[c] FS : "") $0 } END { for (i=1;i<=n;i++) print a[i] | "column -t" }'

結果:

1  6   11  16  21
2  7   12  17
3  8   13  18
4  9   14  19
5  10  15  20

そしてもう一つ:

seq 40 | awk -v n=6 '{ c++ } c>n { c=1 } { a[c] = (a[c] ? a[c] FS : "") $0 } END { for (i=1;i<=n;i++) print a[i] | "column -t" }'

結果:

1  7   13  19  25  31  37
2  8   14  20  26  32  38
3  9   15  21  27  33  39
4  10  16  22  28  34  40
5  11  17  23  29  35
6  12  18  24  30  36
于 2013-01-26T07:41:30.407 に答える