Как создать список с такими цифрами?

Как создать такой список:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

Где я запускаю command 15 или что-то в этом роде. Или, если я укажу 100 это сделало бы это с 100 номерами или 10000 и это сделало бы это, как это, но 10000 номеров.

Это должно быть пять номеров на каждой строке (как видно выше).

вы просто делаете

 seq 1 n | xargs -n 5 echo 

n – номер, который вы хотите достичь

Если ваша ОС имеет bash, но не seq, вот альтернатива (thx to @cuonglm и @jimmyj для своих замечаний)

 echo {1..n} | xargs -n5 

(возможно, вам придется быть осторожным при достижении очень высокого количества с этим, в зависимости от ОС и версии bash, и если bash на самом деле попытался развернуть сначала или в этом случае достаточно умен, чтобы кормить понемногу, не пытаясь вместить все 1..n как строка в памяти и подать, чтобы эхо …)

И благодаря cuonglm и StephaneChazelas, я добавляю альтернативу, которая очень и очень тяжелая, чем у моего первого решения xargs (в котором xargs называет / bin / echo, вместо того, чтобы использовать встроенную оболочку, каждые 5 чисел) (это вероятно, аналогично второму, где xargs не вызывает эхо):

 printf '%s %s %s %s %s\n' {1..n} 

Это второе и третье решения отличаются от первого в том, что оболочка сначала расширяет 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 

Чистый 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 

С расширением printf и brace :

 printf '%s %s %s %s %s\n' {1..15} 

С zsh :

 $ print -aC5 {1..15} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ autoload zargs # if not in ~/.zshrc $ zargs -n 5 {1..15} -- echo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ printf '%s %s %s %s %s\n' {1..15} 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

(последний также работает в последних версиях ksh93 или bash).

используя цикл:

 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 

С awk вы можете сказать:

 seq 15 | awk 'ORS=NR%5?FS:RS' 

Он возвращает:

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

В основном, он изменяет разделитель выходной записи (разделитель строк) с помощью разделителя полей (пробел, по умолчанию) или разделителя записей (новая строка, по умолчанию). Поэтому, если число строк кратно 5 , добавляется новая строка; в противном случае – пробел.

Я написал более широкое объяснение в аналогичном вопросе: bash / sed / awk / etc удаляет все остальные символы новой строки .

Вы можете использовать seq , tr и sed :

 seq 15 | tr '\n' ' ' | sed 's/\([0-9]* [0-9]* [0-9]* [0-9]* [0-9]* \)/\1\ /g' 

Или как оптимизированное сочетание ответов Оливье, Бенуа и меня (в его комментариях):

 seq 15 | xargs -n 5 

Все элегантные решения были сделаны … так что с GNU awk и bash

 echo {1..15} | awk -v RS='[[:space:]]' '{ORS=NR % numcols?RT:"\n"; print}' numcols=5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

или с GNU grep

 echo {1..15} | grep -oE '([[:digit:]]+[[:blank:]]+){4}[[:digit:]]+' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15