
He generado un montón de archivos que contienen solo un número. Luego tengo información sobre estos archivos en cada nombre de archivo. Lo que quiero hacer es recopilar todo el contenido del archivo como una columna en un archivo nuevo y luego obtener una parte de cada nombre de archivo como columnas separadas en este nuevo archivo.
Los nombres de archivo se ven así: traj-num1-iter-num2-states-num3.gradient
, donde num1, num2 y num3 son simplemente números diferentes. Un ejemplo de lo que quiero:
$ cat traj-10-iter-220-states-01.gradient
-0.0014868599999999788
$ cat newfile
traj iter states gradient
10 220 01 -0.0014868599999999788
Sospecho que esto se puede lograr, pero no sé cómo.
Respuesta1
Usando FILENAME
la variable de AWK:
awk 'BEGIN { OFS = "\t"; print "traj", "iter", "states", "gradient"; FS="-|\\." } { gradient=$0; $0=FILENAME; print $2, $4, $6, gradient }' traj-*-iter-*-states-*.gradient
generará la línea de encabezado solicitada, luego procesará cada traj-*-iter-*-states-*.gradient
archivo, generando los valores extraídos de su nombre de archivo y su contenido.
La siguiente variante, basada en unasugerenciaporOlivier Dulac, extrae la línea de encabezado del nombre del archivo y utiliza una versión más simple de FS
:
awk 'BEGIN { OFS = "\t"; FS="[-.]" } { contents=$0; $0=FILENAME; if (!header) { print $1, $3, $5, $7; header=1 }; print $2, $4, $6, contents }' traj-*-iter-*-states-*.gradient
Puede cambiar el globo al final para que coincida con los archivos que le interesen y el encabezado se adaptará (al primer archivo que se procese).