Мне нужно зациклить некоторые значения,
for i in $(seq $first $last)
do
does something here
done
Для $first
и $last
мне нужно, чтобы он был фиксированной длины 5. Так что, если ввод 1
, мне нужно добавить нули перед таким, чтобы он стал 00001
. Это петли до 99999
, например, но длина должна быть 5.
Например: 00002
, 00042
, 00212
, 012312
и так далее.
Любая идея о том, как я могу это сделать?
for variable in $(something to generate the numbers); do ...
но это проблематично, когда список чисел длинный. Это гораздо эффективнее в использованииsomething to generate the numbers | while read -r variable; do ...
. Смотрите также mywiki.wooledge.org/DontReadLinesWithFor, в котором обсуждается чтение строк из файлов и т. Д., Но некоторые аргументы применимы и здесь.Ответы:
Хотя в вашем конкретном случае, вероятно, проще всего использовать
-f
флаг,seq
чтобы заставить его форматировать числа при выводе списка. Например:выдаст следующий вывод:
В более общем смысле,
bash
имеетprintf
встроенную функцию, так что вы можете дополнить вывод нулями следующим образом:Вы можете использовать
-v
флаг, чтобы сохранить выходные данные в другой переменной:Обратите внимание, что
printf
поддерживается немного другой формат,seq
поэтому вам нужно использовать%05d
вместо%05g
.источник
%05g
вместо того, чтобы%05d
исправить это для меня. «00026» давал мне «00022» . Спасибо!seq
поддерживает подмножество символов формата. которыйprintf
поддерживает (и что включает в себя подмножестваg
, но неd
). Поведение персонажейd
иg
отличается тонко в том , чтоd
интерпретирует0
-prefixed числа строк в восьмеричном чисел и преобразует их в десятичной системе , аg
рассматривает их как десятичные дроби. (@EdManet: именно поэтому «00026» превратился в «00022» сd
). Еще одна вещь, о которой стоит упомянуть:seq -w
выполняет автоматическое заполнение нулями выходных чисел на основе самого широкого сгенерированного числа.for (( i = 0; i <= 0xffffffff; i++ )) do printf "%08x\n" $i ; done >> hex.txt
создал 8-значный шестнадцатеричный список. Спасибо.seq --help
: «FORMAT должен быть пригоден для печати одного аргумента типа 'double'; по умолчанию используется% .PRECf, если FIRST, INCREMENT и LAST являются десятичными числами с фиксированной запятой с максимальной точностью PREC и% g в противном случае." Возможные спецификаторы преобразования являютсяefgaEFGA
.Проще еще можно просто сделать
источник
4.4.23(1)-release
Если конец последовательности имеет максимальную длину заполнения (например, если вы хотите 5 цифр и команда имеет значение «seq 1 10000»), то вы можете использовать флаг «-w» для seq - он добавляет сам заполнитель.
производить
источник
используйте printf с "% 05d", например
источник
Очень простое использование
printf
источник
Используйте awk следующим образом:
ВЫВОД:
Обновить:
В качестве чистой альтернативы bash вы можете сделать это, чтобы получить тот же результат:
Таким образом, вы можете избежать использования внешней программы,
seq
которая НЕ доступна для всех разновидностей * nix.источник
awk's
BEGIN
оператор так, чтобы нам не приходилось использоватьheredoc
присвоение.Я дополняю вывод большим количеством цифр (нулей), чем мне нужно, затем использую tail, чтобы использовать только то количество цифр, которое я ищу. Обратите внимание, что вы должны использовать «6» в хвосте, чтобы получить последние пять цифр :)
источник
Если вы хотите N цифр, добавьте 10 ^ N и удалите первую цифру.
Вывод:
источник
Это будет работать также:
источник
Другой путь :
Так что простая функция для преобразования любого числа будет:
источник
Один из способов без использования внешнего процесса - это манипулирование строками, в общем случае это будет выглядеть так:
Это хорошо работает и на WSL, где разветвление - очень тяжелая операция. У меня был список 110000 файлов, использование
printf "%06d" $NUM
заняло более 1 минуты, решение выше заняло около 1 секунды.источник
1.) Создайте последовательность чисел 'seq' от 1 до 1000 и зафиксируйте ширину '-w' (ширина определяется длиной конечного числа, в данном случае 4 цифры на 1000).
2.) Кроме того, выберите, какие цифры вы хотите, используя «sed -n» (в этом случае мы выбираем номера 1-100).
3.) «эхо» каждого номера. Числа хранятся в переменной «i», доступ к которой осуществляется с помощью «$».
Плюсы: этот код довольно чистый.
Минусы: seq не свойственен всем системам Linux (насколько я понимаю)
источник
Если вы просто добавляете числа с нулями для достижения фиксированной длины, просто добавьте ближайшее кратное 10, например. для 2 цифр добавьте 10 ^ 2, затем удалите первую 1 перед отображением вывода.
Это решение работает для заполнения / форматирования отдельных чисел любой длины или целой последовательности чисел с использованием цикла for.
Протестировано на Mac OSX 10.6.8, Bash ver 3.2.48
источник