Dis*_*ame 9 shell-script text-processing
我如何构建这样的列表:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
我跑的地方command 15
什么的。或者,如果我指定100
它会包含 100 个数字,或者10000
它会像这样但包含 10000 个数字。
每行应该是五个数字(如上所示)。
Oli*_*lac 18
你只是做
seq 1 n | xargs -n 5 echo
Run Code Online (Sandbox Code Playgroud)
n 是您想要达到的数字
如果您的操作系统有 bash 但没有 seq,这里有一个替代方案(感谢@cuonglm 和@jimmyj 的评论)
echo {1..n} | xargs -n5
Run Code Online (Sandbox Code Playgroud)
(根据操作系统和 bash 版本,当达到非常高的数字时,您可能需要小心,如果 bash 确实尝试首先扩展,或者在这种情况下足够聪明,可以一点一点地喂食,而无需尝试适应整体1..n 作为内存中的字符串并将其输入到 echo...)
并且感谢 cuonglm 和 StephaneChazelas,我添加了一个替代方案,它比我的第一个 xargs 解决方案(其中 xargs 调用 /bin/echo,而不是能够使用 shell 的内置函数,每 5 个数字)(它是可能类似于 xargs 不调用 echo 的第二个):
printf '%s %s %s %s %s\n' {1..n}
Run Code Online (Sandbox Code Playgroud)
第二个和第三个解决方案与第一个不同,因为 shell 必须首先扩展 1..n,然后 printf(或 xargs)可以开始打印,如果我没记错的话......所以它稍后开始(特别是如果 n 是大)...如果 n 非常大,可能会达到一些限制(行长度或内存,取决于实现和操作系统)。
纯coreutils
:
$ seq 15 | paste - - - - -
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
纯perl:
$ perl -e '@a=1..15; while($i<=$#a){print "@a[$i..$i+4]\n";$i+=5}'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
$ echo {1..15} | grep -oP '(\d+ ){4}\d+'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
如果您不介意前导 0:
$ echo {01..15} | fold -sw 16
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
如果你这样做:
$ echo {01..15} | fold -sw 16 | sed 's/0\([1-9]\) /\1 /g'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
这些中的任何一个都可以制成一个函数,该函数将数字作为输入并打印相应的列表。例如,
printnums(){
seq $1 | paste - - - - -
}
Run Code Online (Sandbox Code Playgroud)
然后你可以运行
$ printnums 30
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
26 27 28 29 30
Run Code Online (Sandbox Code Playgroud)