Извлечь информацию как из имени файла, так и из его содержимого

Извлечь информацию как из имени файла, так и из его содержимого

Я сгенерировал кучу файлов, которые все содержат только одно число. Затем у меня есть некоторая информация об этих файлах в каждом имени файла. Я хочу собрать все содержимое файла в виде столбца в новом файле, а затем получить некоторую часть каждого имени файла в виде отдельных столбцов в этом новом файле.

Имена файлов выглядят так: traj-num1-iter-num2-states-num3.gradient, где num1, num2 и num3 — это просто разные числа. Пример того, что я хочу:

$ cat traj-10-iter-220-states-01.gradient
-0.0014868599999999788

$ cat newfile
traj    iter     states    gradient
10      220      01        -0.0014868599999999788

Я подозреваю, что этого можно добиться, но не знаю как.

решение1

Использование переменной AWK FILENAME:

awk 'BEGIN { OFS = "\t"; print "traj", "iter", "states", "gradient"; FS="-|\\." } { gradient=$0; $0=FILENAME; print $2, $4, $6, gradient }' traj-*-iter-*-states-*.gradient

выведет запрошенную строку заголовка, затем обработает каждый traj-*-iter-*-states-*.gradientфайл, выводя значения, извлеченные из его имени файла, и его содержимое.

Следующий вариант, основанный напредположениекОливье Дюлак, извлекает строку заголовка из имени файла и использует более простую версию 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

Вы можете изменить шаблон в конце, чтобы он соответствовал интересующим вас файлам, и заголовок будет адаптирован (к первому обработанному файлу).

Связанный контент