Extraiga información tanto del nombre del archivo como del contenido del archivo.

Extraiga información tanto del nombre del archivo como del contenido del archivo.

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 FILENAMEla 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-*.gradientarchivo, 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).

información relacionada