Zeilen mit Trennzeichen teilen und beide Felder in einer anderen Variablen speichern

Zeilen mit Trennzeichen teilen und beide Felder in einer anderen Variablen speichern

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

cutliest 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 jobidVariable wäre daher eine durch eine neue Zeile begrenzte Zeichenfolge von Job-IDs, während die idVariable 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 readDaten aus einer Eingabezeile gleichzeitig in mehrere Variablen gelesen werden können. Durch Setzen IFSeines Doppelpunkts wird die Zeile am Doppelpunkt geteilt und das erste Feld wird eingelesen, idwährend der Rest in eingelesen wird jobid. Ein Aufruf ist cutüberhaupt nicht erforderlich.

verwandte Informationen