我正在尝试获取文件的输入以生成一个列表,其中包含按排序顺序排列的数字的行和列。这将用于稍后生成可打印文档,因此我能够替换当前在 Excel 中手动使用的步骤。
原始数据是 1 到 20000 之间的整数。假设:
1 2 3 4 5 6 7 8 ...
或者
1
2
3
4
5
该列表按数值排序并用空格分隔。 (可选)我可以用 \n 或其他任何东西分隔这些值,如果这有助于我实现我的目标
列数量应该是 7,但很可能我以后可以自己更改它。
我想要的输出:
1 40 80
2 41 81
3 42 82
4 43 83
我在阅读一些 unix.se 问题、有关 SF 的其他建议、专栏手册页、fml 等的过程中希望弄清楚这一点时尝试了什么。
for value in $(cat /tmp/list); do printf "%-8s\n" "${value}"; done|column -x
输出(简化,制表符之间):
1 2 3 4
5 6 7 8
...
接下来的尝试是关于 Serverfault 的建议:
cat /tmp/list |fmt |column -t
输出:
1 2 3 4 5
6 7 8 9 10
我想了解我在这个过程中理解的问题出在哪里,而不仅仅是原始解决方案(但这会有帮助)。
答案1
echo {1..20000} | tr " " "\n" | sort -n | pr -T3 -s" " -l 6667
输出:
1 6668 13335 2 6669 13336 3 6670 13337 4 6671 13338 5 6672 13339 6 6673 13340 7 6674 13341 8 6675 13342 9 6676 13343 10 6677 13344 11 6678 13345 。 。 。
要使用您的文件进行测试:
tr " " "\n" < file | sort -n | pr -T3 -s" " -l 6667
20000 个数字是全在一行还是一列都没有关系。
答案2
假设您的输入由换行符分隔的数字组成,例如:
1
2
3
...
只需一个简单的sed
脚本即可将它们放入列中:
$ sed -n '{N;N;N;N;N;N;s/\n/\t/g;p}'
当脚本遇到一行时,它会再将 6 行 ( N;N;N;N;N;N
) 读入缓冲区,将缓冲区中的每个换行符替换为制表符 ( s/\n/\t/g
) 并打印缓冲区 ( p
)。结果:
1 2 3 4 5 6 7
8 9 10 11 12 13 14
...
笔记:输入中的行数需要是七的倍数,任何剩余的条目都将被删除。