我有一个包含数据的大型文本文件,格式如下:
1
2
3
4
5
6
7
8
9
10
我正在尝试将其转换为:
1 2 3
4 5 6
7 8 9
10
我试过awk
:
'{ if (NR%2) {printf "%40s\n", $0} else {printf "%80s\n", $0} }' file.txt
答案1
答案2
该columns
工具可以执行以下操作:
$ seq 10 | columns -W 16 -c 3
1 2 3
4 5 6
7 8 9
10
-W 16
只是将线宽设置得小一些。
columns
不是 Unix 标准工具。它是一部分GNU AutoGen。
更常见column
命令的某些版本可能能够使用 来设置列数-c
,但现代版本似乎已经改变了其含义,以按字符数设置行宽。
还有pr
mpez0 在评论中建议的:
$ seq 10 | pr -aT3
1 2 3
4 5 6
7 8 9
10
-aT3
是 的缩写--across --omit-pagination --columns=3
。
pr
-T
尽管/--omit-pagination
似乎是 GNU 特有的,但它位于 coreutils 和 POSIX 中。
答案3
尝试像
seq 1 10 | awk '{printf "%40s", $0} !(NR%3) {printf "\n"}'
1 2 3
4 5 6
7 8 9
10
答案4
这将使每行输入的字符串宽度在 40、80、120 之间交替移动:
awk '{ m = (NR-1) % 3; i = (m+1) * 40; printf "%*s\n", i, $0 }'
变量:
m
- 行号模 3(即0
,1
,2
重复)i
- 给定 m 值的缩进
在没有任何其他指令的情况下,我继续使用您自己的printf
格式,以便每行输入都被格式化为其自己的输出行,并且每行都将在可用空间中右对齐。
如果您想要每行三个 40 列的条目,如示例中所示,而不是代码中所示,您可以使用此选项(如果您想要左对齐文本,请将 更改为 )40s
:-40s
awk '{ printf "%40s", $0 } !(NR % 3) { printf "\n" }'