Bash последовательность 00 01... 10

в bash, с

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10

Я могу получить последовательность чисел, но в некоторых случаях мне нужно

01 02 03 ... 10

как я могу это получить?

и как я могу получить?

001 002 ... 010 011 .. 100

Ответы

Ответ 1

Это будет работать в любой оболочке на машине с установленной coreutils (спасибо комментаторам за исправление меня):

seq -w 1 10

и

seq -w 1 100

Ответ 2

используйте команду seq с параметром -f, попробуйте:

seq -f "%02g" 0 10

Результаты: 00 01 02 03 04 05 06 07 08 09 10

seq -f "%03g" 0 10

Результаты: 000 001 002 003 004 005 006 007 008 009 010

Ответ 3

printf "%02d " {1..10} ; echo

Вывод:

01 02 03 04 05 06 07 08 09 10

Аналогично:

printf "%03d " {1..100} ; echo 

В более поздних версиях bash просто:

echo {01..10}

и

echo {001..100}

Ответ 4

$ printf "%02d " {0..10}; echo
00 01 02 03 04 05 06 07 08 09 10 
$ printf "%03d " {0..100}; echo
000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100

Просто измените ширину поля в строке формата (2 и 3 в этом случае) и, конечно, диапазон расширения скобок. echo существует только для косметических целей, поскольку строка формата не содержит самой новой строки.

printf - это встроенная оболочка, но у вас, вероятно, также есть версия от coreutils, которая может быть использована на месте.

Ответ 5

awk:

awk 'BEGIN { for (i=0; i<10; i++) printf("%02d ", i) }'

Ответ 6

В bash

будет работать следующее:
echo {01..10}

** EDIT, видя ответы вокруг меня, я просто хотел добавить это, в случае, когда мы говорим о командах, которые будут работать под любым терминалом

yes | head -n 100 | awk '{printf( "%03d ", NR )}'   ##for 001...100

или

yes | head -n 10 | awk '{printf( "%03d ", NR )}'    ##for 01..10

Ответ 7

Есть так много способов сделать это! Мой личный фаворит:

yes | grep y | sed 100q | awk '{printf( "%03d ", NR )}'; echo

Ясно, что ни sed, ни grep не являются необходимыми (grep гораздо более тривиален, так как если вы опускаете sed, вам нужно изменить awk), но они вносят вклад в общее удовлетворение решением! Финал echo тоже не нужен, но всегда приятно иметь завершающий перевод строки.

Еще один приятный вариант:

yes | nl -ba | tr ' ' 0 | sed 100q | cut -b 4-6

Или (менее нелепо):

yes '' | sed ${top-100}q | nl -ba -w ${width-3} -n rz

Ответ 8

как прокомментировал favoretti, seq - ваш друг.

Но есть оговорка:

seq -w использует второй аргумент для установки формата, который будет использоваться.

Таким образом, команда seq -w 1 9 будет печатать последовательность 1 2 3 4 5 6 7 8 9

Чтобы распечатать последовательность 01.. 09, вам необходимо сделать следующее:

seq -w 1 09

Или для ясности используйте один и тот же формат на обоих концах, например:

seq -w 000 010 для серии 001 002 003... 010

И вы также можете использовать аргумент шага, который также работает в обратном порядке:

seq -w 10 -1 01' for 10,09,08...01 or seq -w 01 2 10` за 01,03,05,07,09

Ответ 9

echo 0{0..9}

Вы можете получить: 00 01 02 03 04 05 06 07 08 09

echo 0{0..9} 1{0..9}

Вы можете получить: 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19

echo 00{0..9} 0{10..99}

Вы можете получить 001.. 099