GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Durchlaufen des Inhalts einer Datei in Bash

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).


Linux
  1. Dateien mit Leerzeichen im Namen durchlaufen??

  2. Bash-Datei Massenumbenennung mit Zähler?

  3. Woher weiß ich den Namen der Skriptdatei in einem Bash-Skript?

  4. Drucken Sie eine Datei, wobei Sie die ersten X-Zeilen in Bash überspringen

  5. Durchlaufen der Elemente einer Pfadvariablen in Bash

Benennen Sie eine Datei im Linux-Terminal um

Warum erkennt das Bash-Skript keine Aliase?

Den Inhalt einer Datei auf den Befehl „echo“ umleiten?

Die Bash‘?

Alle Terminalausgaben in einer Datei speichern?

5 Befehle zum Anzeigen des Inhalts einer Datei in der Linux-Befehlszeile