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
Diese Optionen überspringen die letzte Zeile der Datei, wenn kein abschließender Zeilenvorschub vorhanden ist.
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:Zeile für Zeile:Eingabeumleitung
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo "$p"
done < "$filename"
Option 1b: While-Schleife:Zeile für 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
Dies ist nicht besser als andere Antworten, aber eine weitere Möglichkeit, die Arbeit in einer Datei ohne Leerzeichen zu erledigen (siehe Kommentare). Ich finde, dass ich oft Einzeiler benötige, um Listen in Textdateien zu durchsuchen, ohne den zusätzlichen Schritt der Verwendung separater Skriptdateien.
for word in $(cat peptides.txt); do echo $word; done
Dieses Format ermöglicht es mir, alles in einer Befehlszeile zusammenzufassen. Ändern Sie den Teil "echo $word" beliebig und Sie können mehrere Befehle eingeben, die durch Semikolons getrennt sind. Das folgende Beispiel verwendet den Inhalt der Datei als Argumente in zwei anderen Skripten, die Sie möglicherweise geschrieben haben.
for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done
Oder wenn Sie beabsichtigen, dies wie einen Stream-Editor zu verwenden (lernen Sie sed), können Sie die Ausgabe wie folgt in eine andere Datei ausgeben.
for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done > outfile.txt
Ich habe diese wie oben beschrieben verwendet, weil ich Textdateien verwendet habe, in denen ich sie mit einem Wort pro Zeile erstellt habe. (Siehe Kommentare) Wenn Sie Leerzeichen haben, die Ihre Wörter/Zeilen nicht teilen sollen, wird es etwas hässlicher, aber derselbe Befehl funktioniert immer noch wie folgt:
OLDIFS=$IFS; IFS=$'\n'; for line in $(cat peptides.txt); do cmd_a.sh $line; cmd_b.py $line; done > outfile.txt; IFS=$OLDIFS
Dies weist die Shell nur an, nur bei Zeilenumbrüchen zu teilen, nicht bei Leerzeichen, und stellt dann die Umgebung wieder auf den vorherigen Zustand zurück. An dieser Stelle möchten Sie vielleicht erwägen, alles in ein Shell-Skript zu packen, anstatt alles in eine einzige Zeile zu quetschen.
Viel Glück!
Eine Möglichkeit, dies zu tun, ist:
while read p; do
echo "$p"
done <peptides.txt
Wie in den Kommentaren erwähnt, hat dies die Nebeneffekte, dass führende Leerzeichen gekürzt, Backslash-Sequenzen interpretiert und die letzte Zeile übersprungen werden, wenn ein abschließender Zeilenvorschub fehlt. Wenn Sie Bedenken haben, können Sie Folgendes tun:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Wenn der Schleifenkörper ausnahmsweise von der Standardeingabe gelesen werden kann, können Sie die Datei mit einem anderen Dateideskriptor öffnen:
while read -u 10 p; do
...
done 10<peptides.txt
Hier ist 10 nur eine beliebige Zahl (anders als 0, 1, 2).