将每N行输入放入一个新列

vek*_*tor 4 unix linux bash shell awk

在bash中,给出输入

1
2
3
4
5
6
7
8
...
Run Code Online (Sandbox Code Playgroud)

N例如5,我想输出

1  6  11
2  7  12
3  8  ...
4  9
5  10 
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

Chr*_*our 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
Run Code Online (Sandbox Code Playgroud)


Ken*_*ent 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 "" }}' 
Run Code Online (Sandbox Code Playgroud)

输出:

1 6 11 16 
2 7 12 17 
3 8 13 18 
4 9 14 19 
5 10 15 20
Run Code Online (Sandbox Code Playgroud)

请注意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
Run Code Online (Sandbox Code Playgroud)

测试

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 
Run Code Online (Sandbox Code Playgroud)