我有一个包含数据的大文本文件,格式如下:
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
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
一个解决方案
paste
paste
是一个 Unix 标准工具,该标准保证这至少适用于 12 列。该
columns
工具可以做到这一点:-W 16
只是将线宽设置为较小的值。columns
不是 Unix 标准工具。它是GNU AutoGen的一部分。更常见的
column
命令的某些版本可能能够使用 设置列数-c
,但现代版本似乎已经改变了它的含义,以通过字符数设置行宽。mpez0 在评论中也
pr
建议:-aT3
是 的缩写--across --omit-pagination --columns=3
。pr
在 coreutils 和 POSIX 中,尽管-T
/--omit-pagination
似乎是特定于 GNU 的。试试喜欢
这项工作的工具是
rs
(“重塑”):我们可以将列分隔符更改为制表符:
或右对齐:
rs
不是 Unix 标准工具。但是,它可以广泛使用。它是在 4.2BSD 中发明的,在所有现代 BSD 中也是如此。例如,它可以移植到基于 Linux 的操作系统,例如Debian。对于每行输入,这将在 40、80、120 之间交替移动字符串宽度:
变量:
m
- 行号模 3(即0
,1
,2
重复)i
- 给定 m 值的缩进在没有任何其他指令的情况下,我继续使用您自己的
printf
格式,以便每一行输入都被格式化为它自己的输出行,并且每一行都将在可用空间中右对齐。如果您想要每行三个 40 列条目,如示例中所示,而不是在您的代码中,您可以使用它(如果您想要左对齐文本,请将其更改为)
40s
:-40s
尝试使用以下命令,测试并运行良好
命令
输出
使用 Python
输出
就个人而言,我更喜欢这种格式
这可以通过
尽管您可能必须调整窗口宽度以使其成为三列。而且您无法重定向到文件;必须剪切粘贴。重定向告诉
ls
做单列。