Eu preciso fazer um loop em alguns valores,
for i in $(seq $first $last)
do
does something here
done
Para $first
e $last
, eu preciso que ele tenha um comprimento fixo 5. Portanto, se a entrada for 1
, eu preciso adicionar zeros na frente para que ela se torne 00001
. Faz um loop até, 99999
por exemplo, mas o comprimento deve ser 5.
Por exemplo: 00002
, 00042
, 00212
, 012312
e assim por diante.
Alguma idéia de como eu posso fazer isso?
for variable in $(something to generate the numbers); do ...
mas isso é problemático quando a lista de números é longa. É muito mais eficiente de usarsomething to generate the numbers | while read -r variable; do ...
. Veja também mywiki.wooledge.org/DontReadLinesWithFor, que discute linhas de leitura de arquivos etc, mas alguns dos argumentos se aplicam aqui também.Respostas:
No seu caso específico, embora seja provavelmente mais fácil usar o
-f
sinalizadorseq
para formatar os números à medida que sai da lista. Por exemplo:produzirá a seguinte saída:
De um modo mais geral,
bash
possuiprintf
um built-in para que você possa amortecer a saída com zeros da seguinte maneira:Você pode usar o
-v
sinalizador para armazenar a saída em outra variável:Observe que ele
printf
suporta um formato ligeiramente diferente do queseq
você precisa usar em%05d
vez de%05g
.fonte
%05g
em vez de%05d
consertar para mim. "00026" estava me dando "00022" . Obrigado!seq
suporta um subconjunto dos caracteres de formato. queprintf
suporta (e que subconjuntos incluig
, mas nãod
). O comportamento dos caracteresd
eg
difere sutilmente aod
interpretar0
seqüências de números prefixadas como números octais e convertê- las em decimal, enquanto asg
trata como decimais. (@ EdManet: é por isso que '00026' se transformou em '00022' comd
). Outra coisa que vale a pena mencionar:seq -w
o preenchimento zero automático dos números de saída com base no número mais amplo gerado.for (( i = 0; i <= 0xffffffff; i++ )) do printf "%08x\n" $i ; done >> hex.txt
produziu uma lista hexadecimal de 8 caracteres. Obrigado.seq --help
: "FORMAT deve ser adequado para imprimir um argumento do tipo 'double'; o padrão é% .PRECf se PRIMEIRO, INCREMENTO e ÚLTIMO são todos números decimais de ponto fixo com a precisão máxima PREC e% g caso contrário." Os possíveis especificadores de conversão sãoefgaEFGA
.Mais fácil ainda, você pode simplesmente fazer
fonte
4.4.23(1)-release
Se o final da sequência tiver comprimento máximo de preenchimento (por exemplo, se você quiser 5 dígitos e o comando for "seq 1 10000"), poderá usar o sinalizador "-w" para seq - ele adicionará o próprio preenchimento.
produzir
fonte
use printf com "% 05d", por exemplo
fonte
Muito simples usando
printf
fonte
Use o awk assim:
RESULTADO:
Atualizar:
Como alternativa pura do bash, você pode fazer isso para obter a mesma saída:
Dessa forma, você pode evitar o uso de um programa externo
seq
que NÃO está disponível em todos os tipos de * nix.fonte
awk's
BEGIN
declaração para não precisarmos usar aheredoc
atribuição.Eu preencho a saída com mais dígitos (zeros) do que o necessário e, em seguida, uso tail para usar apenas o número de dígitos que estou procurando. Observe que você precisa usar '6' na cauda para obter os últimos cinco dígitos :)
fonte
Se você quiser N dígitos, adicione 10 ^ N e exclua o primeiro dígito.
Resultado:
fonte
Isso funcionará também:
fonte
Outro jeito :
Uma função tão simples para converter qualquer número seria:
fonte
Uma maneira sem o uso de bifurcação de processo externo é a manipulação de strings, em um caso genérico seria assim:
Isso funciona muito bem também na WSL, onde a bifurcação é uma operação realmente pesada. Eu tinha uma lista de 110000 arquivos, usando
printf "%06d" $NUM
demorou mais de 1 minuto, a solução acima foi executada em cerca de 1 segundo.fonte
1.) Crie uma sequência de números 'seq' de 1 a 1000 e corrija a largura '-w' (a largura é determinada pelo comprimento do número final, neste caso 4 dígitos para 1000).
2.) Selecione também os números que deseja usar 'sed -n' (nesse caso, selecionamos os números de 1 a 100).
3.) 'ecoam' cada número. Os números são armazenados na variável 'i', acessada usando o '$'.
Prós: Este código é bastante limpo.
Contras: 'seq' não é nativo de todos os sistemas Linux (como eu entendo)
fonte
Se você está logo após preencher números com zeros para obter um comprimento fixo, basta adicionar o múltiplo mais próximo de 10, por exemplo. para 2 dígitos, adicione 10 ^ 2 e remova o primeiro 1 antes de exibir a saída.
Essa solução funciona para preencher / formatar números únicos de qualquer tamanho ou uma sequência inteira de números usando um loop for.
Testado no Mac OSX 10.6.8, Bash ver 3.2.48
fonte