¿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 awk
lugar de en un bucle de shell (llamar awk
a 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 awk
con todos sus .b
archivos 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.
FILENAME
es una variable especial awk
que contiene el nombre del archivo de entrada actual. Asimismo, FNR
es 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 nextfile
despué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
nextfile
tambié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