Come posso iterare attraverso ogni linea di un file di testo con Bash?
Con questo script:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
Ottengo questo output sullo schermo:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(Più tardi voglio fare qualcosa di più complicato con $p
rispetto al semplice output sullo schermo).
La variabile d'ambiente SHELL è (da env):
SHELL=/bin/bash
/bin/bash --version
output:
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
cat /proc/version
output:
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
Il file peptidi.txt contiene:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
Un modo per farlo è:
while read p; do
echo "$p"
done <peptides.txt
Come sottolineato nei commenti, questo ha l'effetto collaterale di tagliare gli spazi bianchi iniziali, interpretare le sequenze di backslash, e saltare l'ultima linea se manca un linefeed finale. Se queste sono preoccupazioni, si può fare:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Eccezionalmente, se il corpo del ciclo può leggere dallo standard input, potete aprire il file usando un descrittore di file diverso:
while read -u 10 p; do
...
done 10<peptides.txt
Qui, 10 è solo un numero arbitrario (diverso da 0, 1, 2).
cat peptides.txt | while read line
do
# do something with $line here
done
e la variante one-liner:
cat peptides.txt | while read line; do something_with_$line_here; done
Queste opzioni salteranno l'ultima riga del file se non c'è un line feed finale.
Puoi evitarlo come segue:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Opzione 1a: Mentre il ciclo: Una linea alla volta: Reindirizzamento dell'input
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
Opzione 1b: While loop: Una linea alla volta: Aprire il file, leggere da un descrittore di file (in questo caso il descrittore di file #4).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done