Wie druckt man das bitte in Bash aus?
for file in *.b; do
a="$(awk 'NR==2{print $1}' "$file")"
printf ('python2 script.py' $file '1 5.732436' $a "f$file" 'n')
done
Ich möchte die Zeichenfolge „python2 script.py“, den Dateinamen, die Zeichenfolgen „1 5.732436“, den Wert der Variablen a, den Dateinamen und f davor und die Zeichenfolge n drucken.
Die gewünschte Ausgabe (für Verzeichnis mit Dateien: file1.b, file2.b, file3.b):
python2 script.py file1.b 1 5.732436 5.5 ffile1.b n
python2 script.py file2.b 1 5.732436 3.2 ffile2.b n
python2 script.py file3.b 1 5.732436 1.2 ffile3.b n
Antwort1
Da Sie bereits verwenden awk
, tun Sie dies mit awk
und nicht in einer Shell-Schleife (der Aufruf awk
in einer solchen Schleife ist langsam und unnötig):
awk 'FNR == 2 {
printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
}' *.b
Dieser Aufruf erfolgt awk
mit allen Ihren .b
Dateien als Eingabe. Für die zweite Zeile jeder Datei wird die gewünschte Ausgabe auf die Standardausgabe gedruckt, wobei die Daten aus dem ersten Feld der aktuellen Eingabedatei übernommen werden.
FILENAME
ist eine spezielle Variable, awk
die den Namen der aktuellen Eingabedatei enthält. Ebenso FNR
ist dies die aktuelle Datensatznummer (Zeilennummer) innerhalb der aktuellen Datei.
Wenn Sie GNU verwenden awk
(wahrscheinlich auf einem Linux-System) und Ihre Dateien sehr groß sind, können Sie die Dinge etwas beschleunigen, indem Sie nextfile
nach dem Drucken aufrufen. Dadurch wird sofort zur nächsten Eingabedatei gesprungen, ohne mehr aus der aktuellen Datei zu lesen.
awk 'FNR == 2 {
printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
nextfile
}' *.b
nextfile
wird auch unterstützt von mawk
.
Antwort2
Versuche dies
awk 'FNR==2 {print ("python2 script.py " FILENAME " 1 5.732436 " $1 " f" FILENAME " n")}' *.b