Ich habe eine Textdatei mit mehreren Zeilen. Ich verwende den while-Befehl, um die Datei zeilenweise zu lesen, aber ich muss die Werte in separaten Variablen speichern und sie im nachfolgenden Shell-Skript verwenden.
DerschneidenDer Befehl begrenzt die gesamte Datei, nicht die gelesene Zeile.
Beispiel my_file.txt
:
d1:jobid1
id2:jobid2
Ich verwende die folgende While-Schleife, um die Datei zeilenweise zu lesen
while IFS= read -r line; do
jobid=`cut -d: -f2`
id=`cut -d: -f1`
#remaining shell-script dependent upon variables#
done < my_file.txt
Ich möchte die Job-ID und die ID für jede Zeile speichern my_file.txt
und das nachfolgende Skript ausführen.Jede Zeile steht in einer neuen Zeile
Brauche Hilfe, um die Werte rekursiv in den Variablen zu speichern. Gibt es eine bessere Möglichkeit, zeilenweise zu lesen und die beiden Felder getrennt voneinander abzugrenzen und zu speichern?
Antwort1
cut
liest standardmäßig von der Standardeingabe. Bei Ihrer Befehlsersetzung wird die Standardeingabe von der Standardeingabe der Schleife übernommen (da Sie für die Aufrufe von keine andere explizite Eingabe angeben cut
). Die Standardeingabe der Schleife stammt aus Ihrer Eingabedatei.
Dies hat zur Folge, dass die erste Zeile Ihrer Datei von gelesen wird read
, während alle anderen Zeilen beim allerersten Aufruf von gelesen werden cut
. Der Wert in der jobid
Variable wäre daher eine durch eine neue Zeile begrenzte Zeichenfolge von Job-IDs, während die id
Variable leer wäre. Die Schleife würde nur eine einzige Iteration ausführen.
Dukönnte benutzen, Zum Beispiel,
id=$( printf '%s\n' "$line" | cut -d: -f1 )
# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
aber das wäre unnötig, da es sauberer und viel effizienter wäre
while IFS=: read -r id jobid; do
# code that uses "$id" and "$jobid" goes here
done <my_file.txt
Dabei wird die Tatsache ausgenutzt, dass read
Daten aus einer Eingabezeile gleichzeitig in mehrere Variablen gelesen werden können. Durch Setzen IFS
eines Doppelpunkts wird die Zeile am Doppelpunkt geteilt und das erste Feld wird eingelesen, id
während der Rest in eingelesen wird jobid
. Ein Aufruf ist cut
überhaupt nicht erforderlich.