Druckzyklus in Bash

Druckzyklus in Bash

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 awkund nicht in einer Shell-Schleife (der Aufruf awkin 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 awkmit allen Ihren .bDateien 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.

FILENAMEist eine spezielle Variable, awkdie den Namen der aktuellen Eingabedatei enthält. Ebenso FNRist 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 nextfilenach 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

nextfilewird auch unterstützt von mawk.

Antwort2

Versuche dies

awk 'FNR==2 {print ("python2 script.py " FILENAME " 1 5.732436 " $1 " f" FILENAME " n")}' *.b

verwandte Informationen