Bash Scripting - Variáveis de leitura linha por linha

3

Eu tenho um único arquivo de coluna com valores como:

40 
58
76

Eu quero fazer um script para ler separadamente todos esses valores, mas não sei as maneiras de fazer isso via script Bash.

Eu quero que o echo exiba algo assim:

LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76
    
por Lucas Dadalt 20.10.2015 / 13:39

4 respostas

9

Para coisas como essa, você pode usar awk :

$ awk '{print "LINE", NR, ": value", $0}' file
LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76

awk lê automaticamente uma linha no momento. NR contém o número da linha e $0 do conteúdo completo da linha, portanto, basta imprimi-los.

Mas se você realmente quer o Bash, diga algo como:

line=1
while IFS= read -r value; do
  echo "LINE $line : value $value"
  (( line ++ ))
done < file

Isso percorre o conteúdo do arquivo file usando um loop while que é alimentado com < file . A cada ciclo, o valor de uma linha é armazenado na variável $value . Então, é uma questão de imprimir o resultado junto com o incremento da variável $line para acompanhar o número da linha.

Veja mais informações em BashFAQ: Como posso ler um arquivo (fluxo de dados, variável) linha por linha (e / ou campo a campo)? .

    
por fedorqui 20.10.2015 / 13:43
1

Via awk

awk '{printf "%s%s%s%s\n","LINE ",NR," : value ",$1}' foo

Exemplo

$ cat foo
40 
58
76

$ awk '{printf "%s%s%s%s\n","LINE ",NR," : value ",$1}' foo
LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76
    
por A.B. 20.10.2015 / 13:46
0

tente este loop de Bash:

while read -r line; do let lineNumber++; echo "LINE $lineNumber : value $line"; done < file.txt

saída:

LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76
    
por Gimbo 22.10.2015 / 12:27
0

Você pode fazer isso nativamente no Bash > 4 usando o mapfile / readarray integrado:

mapfile -t x <in
$ cat in
40 
58
76
$ mapfile -t x <in
$ echo ${x[@]}
40 58 76
$ echo ${x[0]}
40
$ echo ${x[1]}
58
$ echo ${x[2]}
76

Para imprimir os elementos da matriz um por um usando esse formato, você pode usar um for loop:

i=1; for element in ${x[@]}; do echo "LINE $i : value $element"; ((i++)); done
$ i=1; for element in ${x[@]}; do echo "LINE $i : value $element"; ((i++)); done
LINE 1 : value 40
LINE 2 : value 58
LINE 3 : value 76
    
por kos 22.10.2015 / 12:57

Tags