Comando seq: Gerando Sequencias de Numeros

Comando seq: Gerando Sequencias de Numeros

Vai Digitar de 1 Ate 100 na Mao?

Lina: Senpai, preciso criar de test1.txt ate test100.txt. Preciso mesmo digitar o comando 100 vezes?
Veterano Linny: Calma, isso seria doloroso. O comando 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 for para repetir tarefas
  • Como preencher com zeros usando -w e mudar o separador com -s
  • Quando usar seq vs a notacao {1..10} do bash

1. O Que e o Comando seq?

Conclusao: seq imprime uma sequencia de numeros, um por linha. seq 5 gera de 1 ate 5.

Lina: O que "seq" significa?
Veterano Linny: E abreviacao de sequence (sequencia). O uso mais simples e passar um unico numero. Tente digitar seq 5.
$ seq 5
1
2
3
4
5
Lina: Os numeros de 1 a 5 apareceram em coluna.
Veterano Linny: Isso. Passe um numero e ele imprime "1 ate esse numero," um valor por linha. Alimente isso em um loop e se torna uma tarefa repetitiva.

2. Como Mudo o Numero Inicial?

Conclusao: Passe dois argumentos e significa seq INICIO FIM. seq 3 7 gera de 3 ate 7.

Lina: E se eu quiser de 5 a 10 em vez de comecar do 1?
Veterano Linny: Coloque dois numeros: 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 FIM
  • seq INICIO FIM --> INICIO ate FIM
  • seq 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 10 gera de 0 ate 10 em passos de 2.

Lina: Quero imprimir numeros alternados, tipo "2, 4, 6, 8."
Veterano Linny: Coloque o incremento (quanto adicionar a cada vez) no meio. seq 2 2 10 significa "2 ate 10 em passos de 2."
$ seq 0 2 10
0
2
4
6
8
10
Lina: Posso contar de tras pra frente, de um numero grande para um pequeno?
Veterano Linny: Sim. Torne o incremento negativo. 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 variavel i e repetir. Otimo para criar arquivos numerados em massa.

Lina: Finalmente, o jeito de criar 100 arquivos!
Veterano Linny: Combinamos um loop 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
Lina: Cinco arquivos apareceram de uma vez! Entao se eu mudar para 100...
Veterano Linny: Exatamente, basta usar 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 -w para preencher numeros com zeros a esquerda ate o valor mais largo. file01, file02, ... file10 mantem os digitos alinhados para que a ordem de classificacao fique correta.

Lina: Quando listei test1.txt ate test100.txt com ls, eles sairam em uma ordem estranha: test1, test10, test100, test2...
Veterano Linny: Isso porque as quantidades de digitos sao diferentes. Use -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
Lina: Tudo ficou com dois digitos agora!
Veterano Linny: O maior numero (10 aqui) tem dois digitos, entao todos ficam com dois digitos. Va ate 100 e eles se alinham em tres digitos (001-100). Agora seus nomes de arquivo se classificam corretamente.

Combine com criacao de arquivos assim:

for i in $(seq -w 1 100); do touch "log_${i}.txt"; done

Isso cria de log_001.txt ate log_100.txt com digitos alinhados.

6. Como Mudo o Separador ou Formato?

Conclusao: Use -s para mudar o separador de nova linha para virgula, espaco, etc. Use -f para definir um formato no estilo printf.

Lina: E se eu quiser "1,2,3,4,5" em uma linha em vez de uma coluna?
Veterano Linny: Use -s (separador). -s , junta com virgulas.
$ seq -s , 1 5
1,2,3,4,5
Lina: Agora ficou em uma linha. Posso usar espaco como separador tambem?
Veterano Linny: -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, use seq.

Lina: Uma vez vi echo {1..5} imprimir uma sequencia. Qual a diferenca do seq?
Veterano Linny: Boa observacao. {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}
Lina: Ue, {1..$n} nao virou uma sequencia; imprimiu o texto literal.
Veterano Linny: Exato. A expansao de chaves nao funciona com variaveis. Mas 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

Resumo / Proximas Leituras