Ich habe eine Textdatei wie folgt aufgeteilt:
field1,field2,field3
xield1,xield2,xield3
dield1,dield2,dield3
gield1,gield2,gield3
Jede dieser Spalten ist ein Parameter für ein Programm, und ich möchte, dass das Programm für jede Zeile aufgerufen wird
Ich hatte auf eine Schleife gehofft, so etwas wie:
for $i in file
command $field2 -x $field3 -PN -$field1 >> output
done
Was wäre der beste Weg, um so etwas in Bash zu erreichen?
Antworten:
Dies sollte funktionieren, wenn die Anzahl der Felder konstant ist. Anstatt
echo
Ihren Befehl zu verwenden.quelle
Sie sollten ein
while
mit demread
eingebauten verwenden:Wie das funktioniert
cut
Anweisung nimmt die Zeile und teilt sie in das durch angegebene Trennzeichen auf-d
.--output-delimiter
ist das Trennzeichen,cut
mit dem die ausgewählten Felder angezeigt werden. Hier wählen wir ein Leerzeichen aus, damit wir die verschiedenen Felder in das Array einfügen könnenfields
.-f1-
kommt das ins Spiel.fields
, können Sie ein bestimmtes Feld , das Sie mit der Syntax wollen zugreifen ,${field[number]}
wonumber
man weniger ist als die tatsächliche Feldnummer , die Sie da Array - Indizierung wollen nullbasiert ist in Bash.Hinweis
Für eine konstante Anzahl von Feldern
Sie können stattdessen etwas Ähnliches wie die Antwort von 1_CR tun :
Das Obige scheint zwar lauter zu sein, sollte aber in jeder POSIX-kompatiblen Shell funktionieren, nicht nur in Bash.
quelle
IFS
imread
Aufruf ein geeigneter Wert festgelegt wirdSie können
read
jede Zeile in ein Array aufteilen,,
indem Sie sieIFS
entsprechend einstellen .Im obigen Beispiel können Sie also über seinen Index auf jedes Array-Element zugreifen, beginnend mit 0.
quelle
Dieser
awk
Einzeiler macht, was Sie wollen:Ersetzen Sie
echo
durch Ihren Befehl undf.txt
durch die Datei, die Sie durchlaufen möchten.Kurze Erklärung:
-F,
Wird,
als Trennzeichen festgelegt.cmd
erstellt den Befehl undsystem(cmd)
ruft den Befehl auf.quelle
gnu sed kann ebenfalls verwendet werden.
Beachten Sie die Verwendung der Option e für den Befehl s
quelle