Como faço para iterar cada linha de um arquivo de texto com Bash?
Com este guião:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
Eu tenho esta saída no ecrã:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(Mais tarde quero fazer algo mais complicado com $p
do que apenas sair para a tela).
A variável de ambiente **SHELL*** é (de env):
SHELL=/bin/bash
Saída `/bin/bash --versão':
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Saída cat /proc/version
:
Linux version 2.6.18.2-34-default (geeko@buildhost) (gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)) #1 SMP Mon Nov 27 11:46:27 UTC 2006
O arquivo peptides.txt contém:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
Uma maneira de o fazer é:
while read p; do
echo "$p"
done <peptides.txt
Como foi apontado nos comentários, isso tem os efeitos colaterais de aparar os espaços em branco, interpretar as seqüências de contrabarra, e pular a última linha se faltar uma alimentação de linha terminante. Se estas são preocupações, você pode fazer:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Excepcionalmente, se o corpo do laço pode ler a partir da entrada padrão, você pode abrir o arquivo usando um descritor de arquivo diferente:
while read -u 10 p; do
...
done 10<peptides.txt
Aqui, 10 é apenas um número arbitrário (diferente de 0, 1, 2).
cat peptides.txt | while read line
do
# do something with $line here
done
e a variante de uma linha:
cat peptides.txt | while read line; do something_with_$line_here; done
Estas opções saltarão a última linha do arquivo se não houver alimentação de linha de fuga.
Você pode evitar isto através do seguinte:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Opção 1a: Enquanto em loop: Uma linha de cada vez: redirecionamento de entrada
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
Opção 1b: Enquanto em loop: Uma linha de cada vez: Abra o arquivo, leia a partir de um descritor de arquivo (neste caso, o descritor de arquivo #4).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done