Ciclo de impresión en bash

Ciclo de impresión en bash

¿Cómo imprimir esto en bash, por favor?

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

Me gustaría imprimir la cadena 'python2 script.py', el nombre del archivo, las cadenas '1 5.732436', el valor de la variable a, el nombre del archivo y f delante de la cadena n.

La salida deseada (para el directorio con archivos: archivo1.b, archivo2.b, archivo3.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

Respuesta1

Como ya estás usando awk, haz esto en awklugar de en un bucle de shell (llamar awka un bucle como ese es lento e innecesario):

awk 'FNR == 2 { 
    printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
}' *.b

Esto llama awkcon todos sus .barchivos como entrada. Para la segunda línea de cada archivo, imprimirá la salida deseada en la salida estándar, tomando los datos del primer campo del archivo de entrada actual.

FILENAMEes una variable especial awkque contiene el nombre del archivo de entrada actual. Asimismo, FNRes el número de registro actual (número de línea) dentro del archivo actual.

Si está utilizando GNU awk(probablemente en un sistema Linux) y sus archivos son muy grandes, puede acelerar un poco las cosas llamando nextfiledespués de imprimir. Esto saltaría al siguiente archivo de entrada inmediatamente, sin leer más del archivo actual.

awk 'FNR == 2 { 
    printf "python2 script.py %s 1 5.732436 %s f%s n\n", FILENAME, $1, FILENAME
    nextfile
}' *.b

nextfiletambién cuenta con el apoyo de mawk.

Respuesta2

Prueba esto

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

información relacionada