微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将每N行input放入一个新列

在bash中,给定input

1 2 3 4 5 6 7 8 ...

而N例如5,我想输出

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

我该怎么做呢?

使用bashparsingiwlist扫描

合并两个文件(使用行号而不是通用字段)

如何在BASH中打印整行

bash:从频率表中获取百分比

如何在Awk单行/单命令中包含简短函数

使用pipe道input一个awk语句

如何将前10个最近的文件一个目录复制到另一个目录?

比较不同列的两个文件并打印不同的列

用Bash删除具有特定模式的行

replaceshellcript中的另一个文件中的一个文件的键:值?

用你的号码替换下面的脚本中的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 -vn=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 -vn=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 -vn=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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐