Hvordan gennemløber jeg hver linje i en tekstfil med Bash?
Med dette script:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
Jeg får dette output på skærmen:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(Senere vil jeg gøre noget mere kompliceret med $p
end blot at sende det ud på skærmen.)
Miljøvariablen SHELL er (fra 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
Filen peptides.txt indeholder:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
En måde at gøre det på er:
while read p; do
echo "$p"
done <peptides.txt
Som påpeget i kommentarerne har dette den bivirkning, at det beskærer ledende mellemrum, fortolker backslash-sekvenser og springer den sidste linje over, hvis den mangler en afsluttende linefeed. Hvis disse er bekymringer, kan du gøre:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Undtagelsesvis, hvis loop body may read from standard input, kan du åbne filen ved hjælp af en anden fildeskriptor:
while read -u 10 p; do
...
done 10<peptides.txt
Her er 10 blot et vilkårligt tal (forskelligt fra 0, 1, 2).
cat peptides.txt | while read line
do
# do something with $line here
done
og varianten med en linje:
cat peptides.txt | while read line; do something_with_$line_here; done
Disse indstillinger vil springe den sidste linje i filen over, hvis der ikke er nogen afsluttende linjefod.
Du kan undgå dette ved at gøre følgende:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Mulighed 1a: Mens sløjfe: En enkelt linje ad gangen: Omdirigering af input
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
Mulighed 1b: Mens sløjfe: En enkelt linje ad gangen: Åbn filen, læs fra en fildeskriptor (i dette tilfælde fildeskriptor #4).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done