Wie kann ich jede Zeile einer Textdatei mit Bash durchlaufen?
Mit diesem Skript:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
erhalte ich diese Ausgabe auf dem Bildschirm:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(Später möchte ich etwas Komplizierteres mit $p
machen als nur die Ausgabe auf dem Bildschirm).
Die Umgebungsvariable SHELL ist (aus env):
SHELL=/bin/bash
/bin/bash --version
ausgeben:
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
cat /proc/version
Ausgabe:
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
Die Datei peptides.txt enthält:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
Eine Möglichkeit ist, dies zu tun:
while read p; do
echo "$p"
done <peptides.txt
Wie in den Kommentaren erwähnt, hat dies den Nebeneffekt, dass führende Leerzeichen abgeschnitten werden, Backslash-Sequenzen interpretiert werden und die letzte Zeile übersprungen wird, wenn ein abschließender Zeilenvorschub fehlt. Wenn dies Bedenken sind, können Sie das tun:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
In Ausnahmefällen, wenn der Schleifenkörper von der Standardeingabe lesen kann, können Sie die Datei mit einem anderen Dateideskriptor öffnen:
while read -u 10 p; do
...
done 10<peptides.txt
Hier ist 10 einfach eine beliebige Zahl (anders als 0, 1, 2).
cat peptides.txt | while read line
do
# do something with $line here
done
und die Einzeiler-Variante:
cat peptides.txt | while read line; do something_with_$line_here; done
Mit diesen Optionen wird die letzte Zeile der Datei übersprungen, wenn es keinen abschließenden Zeilenvorschub gibt.
Sie können dies wie folgt vermeiden:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Option 1a: While-Schleife: Jeweils eine Zeile: Umleitung der Eingabe
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
Option 1b: While-Schleife: Jeweils eine Zeile: Öffnen Sie die Datei, lesen Sie von einem Dateideskriptor (in diesem Fall Dateideskriptor #4).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done