在bash中,给定的输入
1
2
3
4
5
6
7
8
...
和N
例如5,我想输出
1 6 11
2 7 12
3 8 ...
4 9
5 10
我该怎么做呢?
在bash中,给定的输入
1
2
3
4
5
6
7
8
...
和N
例如5,我想输出
1 6 11
2 7 12
3 8 ...
4 9
5 10
我该怎么做呢?
与你的电话号码下面的脚本替换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
使用一个鲜为人知的宝石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
下面是我如何与做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