如何用这样的数字构建一个列表?

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 非常大,可能会达到一些限制(行长度或内存,取决于实现和操作系统)。

  • +1 比我的解决方案更具可读性。`seq 1 15` 中的第一个 `1` 并不是真正必要的。 (2认同)

ter*_*don 8

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)

GNU grep(从@1_CR无耻地偷来的):

$ 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)


cuo*_*glm 5

使用printf大括号扩展

printf '%s %s %s %s %s\n' {1..15}
Run Code Online (Sandbox Code Playgroud)