Bash - Sequência de números na mesma linha

10

Eu sei o comando seq para gerar uma sequência de inteiros, um por linha, mas gostaria de fazer duas perguntas:

  1. É possível escrever os números da sequência na mesma linha?

  2. É possível criar uma string feita com a sequência de números separados por um espaço em branco?

por Salsiccio 26.07.2015 / 20:58

5 respostas

20

Com bash , zsh e ksh93 , você pode usar { start..end..step} formulário de expansão de chaves :

$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
    
por 26.07.2015 / 21:04
19

O GNU seq toma a opção de separador ( -s ):

$ seq -s ' ' 1 5
1 2 3 4 5

$ var="$(seq -s ' ' 1 5)"
$ echo "$var"
1 2 3 4 5
    
por 26.07.2015 / 21:04
12

Portátil para todos os shells e qualquer sistema que tenha seq (como estas questões são marcadas)

Se o início for 1:

$ echo $(seq 10)
1 2 3 4 5 6 7 8 9 10

Caso contrário:

$ echo $(seq 5 10)
5 6 7 8 9 10

com bc:

$ echo $(echo "for (i=0;i<=1000;i++) i"| bc)

No bash

echo {1..10}

Nota:

Esta solução de eco funciona se o valor do IFS contiver uma nova linha, o que faz por padrão.
Por padrão, o IFS é definido para a sequência espaço> tab> . E é redefinido para cada início limpo do shell. Mas, se você tem alguma preocupação de que possa ter mudado em algum caso extremo, temos várias soluções.

Under bash, zsh, ksh just use: IFS=$' \t\n' (skip all the rest of this answer).

No entanto, redefinir o valor do IFS sob sh pode ser complexo Leia os detalhes completos aqui .

Desativar o IFS.

$ unset IFS; echo $(seq 5 10)                           #Always work.

sempre funcionará. Desde que não haja nenhum código abaixo (ou scripts filhos) que precisem do IFS configurado, como um script que use OldIFS="$IFS" .

Solução correta.

Usando os truques truque para sh:

sh -c 'IFS="$(printf " \t\nx")"; IFS="${IFS%x}"; printf "$IFS"|xxd'  # correct.
    
por 28.07.2015 / 07:00
3

Use isto:

string="$(seq -s " " 1 10)"
    
por 26.07.2015 / 21:04
0
seq 10 |xargs

... ou ...

seq 10 |paste -s -

Ambos os comandos acima separarão os números inteiros por espaço em branco. xargs usa como padrão a imitação de /bin/echo e, portanto, cada número inteiro é separado por um único espaço. Por padrão, ele terá um tamanho máximo de linha de comando de 128K. Você pode ajustar isso ...

seq 100000 | xargs -s2093009 | wc -l

... imprime 1. Eu o valor para -s aqui não é arbitrário - eu obtive depois de tentar um valor mais alto (o que aparentemente funcionou mesmo assim) mas depois xargs imprimiu o mensagem útil:

-s value should be <2093010

paste é um dos dois (que eu saiba) utilitários sancionados com POSIX para manipular linhas de tamanho arbitrário:

paste specification application usage:

Most of the standard utilities work on text files. The cut utility can be used to turn files with arbitrary line lengths into a set of text files containing the same data. The paste utility can be used to create (or recreate) files with arbitrary line lengths.

     

arquivos de texto

     

A file that contains characters organized into zero or more lines. The lines do not contain NUL characters and none can exceed {LINE_MAX} bytes in length, including the \newline character. Although POSIX.1-2008 does not distinguish between text files and binary files (see the ISO C standard), many utilities only produce predictable or meaningful output when operating on text files. The standard utilities that have such restrictions always specify text files in their STDIN or INPUT FILES sections.

paste é padronizado para um delimitador de tabulação e, portanto, haverá uma tabulação entre cada número inteiro após o segundo comando. Você pode ...

seq 10 |paste -sd ' ' - 

... use a opção -d elimitador para alterar esse comportamento,

    
por 26.07.2015 / 22:07

Tags