Ответ 1
Это будет работать в любой оболочке на машине с установленной coreutils
(спасибо комментаторам за исправление меня):
seq -w 1 10
и
seq -w 1 100
в bash, с
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
Я могу получить последовательность чисел, но в некоторых случаях мне нужно
01 02 03 ... 10
как я могу это получить?
и как я могу получить?
001 002 ... 010 011 .. 100
Это будет работать в любой оболочке на машине с установленной coreutils
(спасибо комментаторам за исправление меня):
seq -w 1 10
и
seq -w 1 100
используйте команду 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
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}
$ 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, которая может быть использована на месте.
awk:
awk 'BEGIN { for (i=0; i<10; i++) printf("%02d ", i) }'
В 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
Есть так много способов сделать это! Мой личный фаворит:
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
как прокомментировал 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
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