如何将单列转换为 3 列?

如何将单列转换为 3 列?

我有一个包含数据的大型文本文件,格式如下:

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

解决方案与 paste

seq 10 | paste - - -
1       2       3
4       5       6
7       8       9
10

paste是一个 Unix 标准工具,该标准保证它至少适用于 12 列。

答案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,但现代版本似乎已经改变了其含义,以按字符数设置行宽。

还有prmpez0 在评论中建议的:

$ 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, 12重复)
  • i- 给定 m 值的缩进

在没有任何其他指令的情况下,我继续使用您自己的printf格式,以便每行输入都被格式化为其自己的输出行,并且每行都将在可用空间中右对齐。

如果您想要每行三个 40 列的条目,如示例中所示,而不是代码中所示,您可以使用此选项(如果您想要左对齐文本,请将 更改为 )40s-40s

awk '{ printf "%40s", $0 } !(NR % 3) { printf "\n" }'

相关内容