Hoe doorloop ik elke regel van een tekstbestand met Bash?
Met dit script:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
Ik krijg deze uitvoer op het scherm:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(Later wil ik iets ingewikkelder doen met $p
dan alleen uitvoer naar het scherm).
De omgevingsvariabele SHELL is (van env):
SHELL=/bin/bash
/bin/bash --version
uitvoer:
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
cat /proc/version
uitvoer:
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
Het bestand peptides.txt bevat:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
Een manier om het te doen is:
while read p; do
echo "$p"
done <peptides.txt
Zoals aangegeven in de commentaren, heeft dit als neveneffect dat voorloopwitruimte wordt verwijderd, backslash reeksen worden geïnterpreteerd en de laatste regel wordt overgeslagen als die een afsluitende linefeed mist. Als dit zorgen baart, kun je doen:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Bij wijze van uitzondering, als de loop body mag lezen van standaard input, kunt u het bestand openen met een andere bestandsdescriptor:
while read -u 10 p; do
...
done 10<peptides.txt
Hier is 10 gewoon een willekeurig getal (verschillend van 0, 1, 2).
cat peptides.txt | while read line
do
# do something with $line here
done
en de one-liner variant:
cat peptides.txt | while read line; do something_with_$line_here; done
Deze opties slaan de laatste regel van het bestand over als er geen regel feed achteraan staat.
U kunt dit vermijden door het volgende te doen:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Optie 1a: Terwijl lus: Eén regel per keer: Invoer omleiden
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
Optie 1b: Terwijl lus: Eén regel per keer: Open het bestand, lees van een file descriptor (in dit geval file descriptor #4).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done