Мне нужно зациклить некоторые значения,
for i in $(seq $first $last)
do
does something here
done
For $ first
и $ last
, мне нужно, чтобы он был фиксированной длины 5. Итак, если ввод 1
, мне нужно добавить нули впереди, чтобы становится 00001
. Он повторяется, например, до 99999
, но длина должна быть 5.
Например: 00002
, 00042
, 00212
, 012312
и так далее.
Есть идеи, как я могу это сделать?
Если вы просто добавляете числа с нулями для достижения фиксированной длины, просто добавьте ближайшее кратное 10, например. для 2 цифр добавьте 10 ^ 2, затем удалите первую 1 перед отображением вывода.
Это решение работает для дополнения / форматирования отдельных чисел любой длины или целой последовательности чисел с использованием цикла for.
# Padding 0s zeros:
# Pure bash without externals eg. awk, sed, seq, head, tail etc.
# works with echo, no need for printf
pad=100000 ;# 5 digit fixed
for i in {0..99999}; do ((j=pad+i))
echo ${j#?}
done
Протестировано на Mac OSX 10.6.8, Bash ver 3.2.48
Одним путем, не используя внешнее разветвление процесса является обработка строк, в универсальном случае это было бы похоже на это:
#start value
CNT=1
for [whatever iterative loop, seq, cat, find...];do
# number of 0s is at least the amount of decimals needed, simple concatenation
TEMP="000000$CNT"
# for example 6 digits zero padded, get the last 6 character of the string
echo ${TEMP:(-6)}
# increment, if the for loop doesn't provide the number directly
TEMP=$(( TEMP + 1 ))
done
Это работает вполне хорошо над WSL также, где разветвление является действительно тяжелой операцией. У меня было 110 000 списков файлов, использование printf "%06d" $NUM
приняло 1 минуту, решение выше работало приблизительно через 1 секунду.