我如何构建这样的列表:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
我跑步的地方command 15
或者什么的。或者,如果我指定100
它会使用 100 个数字,或者10000
会使其像这样但有 10000 个数字。
每行应该有五个数字(如上所示)。
答案1
你只是做
seq 1 n | xargs -n 5 echo
n 是您想要联系的号码
如果您的操作系统有 bash 但没有 seq,这里有一个替代方案(感谢 @cuonglm 和 @jimmyj 的评论)
echo {1..n} | xargs -n5
(到达时您可能必须小心非常较高的数字,具体取决于操作系统和 bash 版本,如果 bash 实际上尝试首先扩展,或者在这种情况下足够聪明,可以一点一点地提供数据,而无需尝试将整个 1..n 作为字符串放入内存中,并且喂它来回声......)
感谢 cuonglm 和 StephaneChazelas,我添加了一个替代方案,它比我的第一个 xargs 解决方案占用的 CPU 资源非常非常少(其中 xargs 调用 /bin/echo,而不是能够使用 shell 的内置函数,每 5 个数字)(它是可能类似于第二个,其中 xargs 不调用 echo) :
printf '%s %s %s %s %s\n' {1..n}
第二个和第三个解决方案与第一个解决方案的不同之处在于,如果我没记错的话,shell 首先要扩展 1..n,然后 printf (或 xargs) 才能开始打印......所以它会稍后启动(特别是如果 n 是大)...并且可以如果 n 很大,就会达到一些限制(行长度或内存,取决于实现和操作系统)。
答案2
纯的coreutils
:
$ seq 15 | paste - - - - -
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
纯 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
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
如果你不介意前导 0:
$ echo {01..15} | fold -sw 16
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
如果你这样做:
$ 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
其中任何一个都可以制作成一个函数,该函数以数字作为输入并打印相应的列表。例如,
printnums(){
seq $1 | paste - - - - -
}
然后你可以运行
$ 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
答案3
与printf
和大括号扩展:
printf '%s %s %s %s %s\n' {1..15}
答案4
使用循环:
for x in {1..15};do echo -n "$x ";if [ $(($x%5)) -eq 0 ];then echo ; fi done
输出:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15