Comando seq: Gerando Sequencias de Numeros
Vai Digitar de 1 Ate 100 na Mao?
seq constroi uma sequencia como "1, 2, 3, ... 100" em um instante. Combine com um loop e voce pode criar todos os 100 arquivos em uma unica linha.O Que Voce Vai Aprender
- Como gerar uma sequencia de numeros (1, 2, 3, ...) com
seq - Como definir o inicio, fim e incremento (passo)
- Como combinar com um loop
forpara repetir tarefas - Como preencher com zeros usando
-we mudar o separador com-s - Quando usar
seqvs a notacao{1..10}do bash
1. O Que e o Comando seq?
Conclusao:
seqimprime uma sequencia de numeros, um por linha.seq 5gera de 1 ate 5.
seq 5.$ seq 5
1 2 3 4 5
2. Como Mudo o Numero Inicial?
Conclusao: Passe dois argumentos e significa
seq INICIO FIM.seq 3 7gera de 3 ate 7.
seq 5 10 significa "5 ate 10." O legal do seq e que o numero de argumentos muda seu significado.$ seq 5 10
5 6 7 8 9 10
A quantidade de argumentos muda o significado
seq FIM--> 1 ate FIMseq INICIO FIM--> INICIO ate FIMseq INICIO PASSO FIM--> define um incremento (proxima secao)
3. Como Defino o Incremento (Passo)?
Conclusao: Passe tres argumentos e significa
seq INICIO PASSO FIM.seq 0 2 10gera de 0 ate 10 em passos de 2.
seq 2 2 10 significa "2 ate 10 em passos de 2."$ seq 0 2 10
0 2 4 6 8 10
seq 5 -1 1 conta regressivamente "5, 4, 3, 2, 1."$ seq 5 -1 1
5 4 3 2 1
Tambem funciona com decimais. seq 1 0.5 3 gera 1.0, 1.5, 2.0, 2.5, 3.0 em passos de 0.5 (inteiros sao preenchidos com o mesmo numero de casas decimais).
4. Como Uso uma Sequencia em um Loop for?
Conclusao: Escreva
for i in $(seq 1 5)para alimentar cada numero gerado na variavelie repetir. Otimo para criar arquivos numerados em massa.
for com seq. A parte $(seq 1 5) e substituida pela saida do seq (1 2 3 4 5). Cada valor vai para i e o corpo se repete.$ for i in $(seq 1 5); do
> touch "test${i}.txt"
> done$ ls
test1.txt test2.txt test3.txt test4.txt test5.txt
seq 1 100. Um trabalho de 100 linhas e feito em uma so. Esse e o poder da geracao de sequencias.Se voce esquecer o $( ) em for i in $(seq ...) e escrever for i in seq 1 5, o loop itera sobre as tres strings literais seq, 1 e 5. O $( ) que substitui um comando por sua saida e obrigatorio.
5. Como Alinho os Digitos (Preenchimento com Zeros)?
Conclusao: Adicione
-wpara preencher numeros com zeros a esquerda ate o valor mais largo.file01,file02, ...file10mantem os digitos alinhados para que a ordem de classificacao fique correta.
ls, eles sairam em uma ordem estranha: test1, test10, test100, test2...-w (width/largura) e ele preenche com zeros, tipo 001, 002, ... 100. A ordem se mantem mesmo quando classificado como texto.$ seq -w 1 10
01 02 03 04 05 06 07 08 09 10
Combine com criacao de arquivos assim:
for i in $(seq -w 1 100); do touch "log_${i}.txt"; doneIsso cria de log_001.txt ate log_100.txt com digitos alinhados.
6. Como Mudo o Separador ou Formato?
Conclusao: Use
-spara mudar o separador de nova linha para virgula, espaco, etc. Use-fpara definir um formato no estilo printf.
-s (separador). -s , junta com virgulas.$ seq -s , 1 5
1,2,3,4,5
-s " " gera espacos. E -f permite adicionar um prefixo ou definir a largura dos digitos com um formato mais preciso.$ seq -f "page-%02g" 1 3
page-01 page-02 page-03
Em -f, %g representa um numero. O 02 em %02g significa "2 digitos, preenchido com zeros." Para preenchimento com zeros apenas, -w da secao anterior e mais simples, mas -f permite adicionar prefixos e casas decimais livremente.
7. Qual a Diferenca do {1..10} do bash?
Conclusao: O bash tambem tem
{1..10}para sequencias. Para valores fixos,{1..10}e mais rapido. Quando o intervalo vem de uma variavel, useseq.
echo {1..5} imprimir uma sequencia. Qual a diferenca do seq?{1..5} e a "expansao de chaves" do bash, que e mais rapida que o seq. Mas tem um ponto fraco: nao expande quando voce usa uma variavel.$ echo {1..5}1 2 3 4 5
$ n=5
$ echo {1..$n}{1..5}
{1..$n} nao virou uma sequencia; imprimiu o texto literal.seq 1 $n respeita a variavel. Por isso o seq brilha quando a contagem do loop vem de uma variavel.$ n=5 $ seq 1 $n
1 2 3 4 5
for i in $(seq 1 $n) expande toda a sequencia na memoria para numeros grandes. Para dezenas de milhares a milhoes de iteracoes, o loop aritmetico for ((i=1; i<=n; i++)) e mais eficiente. Para o intervalo cotidiano de dezenas a milhares, seq e suficiente.
Mini Desafio (clique para abrir)
Crie 12 arquivos de report_01.txt a report_12.txt em massa, com preenchimento de zeros em dois digitos.
Dica: Alinhe os digitos com -w e combine um loop for com touch. for i in $(seq -w 1 12); do touch "report_${i}.txt"; done
8. Armadilhas Comuns e Correcoes
Conclusao: A maioria dos problemas vem de tres coisas: leitura errada da quantidade de argumentos, esquecimento do
$( )e ordem de classificacao quebrada por falta de preenchimento com zeros.
| Sintoma | Causa | Correcao |
|---|---|---|
| Um intervalo diferente do esperado | Entendeu errado a quantidade de argumentos | Verifique a ordem seq INICIO PASSO FIM |
Loop itera sobre o texto seq 1 5 |
Esqueceu o $( ) |
Escreva for i in $(seq 1 5) |
| Arquivos se classificam em ordem errada | Sem preenchimento com zeros | Alinhe digitos com seq -w |
{1..$n} nao e uma sequencia |
Expansao de chaves ignora variaveis | Use seq 1 $n |
| Saida e coluna, nao linha | Separador padrao e nova linha | Mude com -s , ou -s " " |
O que nao fazer
- Expandir um intervalo enorme (milhoes) de uma vez com
$(seq ...)e esgotar a memoria - Criar arquivos numerados sem preenchimento com zeros e ter problemas com a ordem de classificacao depois