Extraire des informations à la fois du nom de file et du contenu du file

J'ai généré un tas de files qui ne contiennent qu'un seul numéro. J'ai alors quelques informations sur ces files dans chaque nom de file. Ce que je veux faire, c'est de collecter tous les contenus de files en tant que colonne dans un nouveau file, puis d'get une partie de chaque nom de file en tant que colonnes distinctes dans ce nouveau file.

Les noms de files ressemblent à ceci: traj-num1-iter-num2-states-num3.gradient , où num1, num2 et num3 ne sont que des nombres différents. Un exemple de ce que je veux:

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

Je soupçonne que cela peut être réalisé, mais je ne sais pas comment.

Utilisation de la variable FILENAME 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 

sortira la ligne d'en-tête demandée, puis traitera chaque file de traj-*-iter-*-states-*.gradient produisant les valeurs extraites de son nom de file et de son contenu.

La variante suivante, basée sur une suggestion d' Olivier Dulac , extrait la ligne d'en-tête du nom de file et utilise une version plus 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 

Vous pouvez changer le glob à la fin pour faire correspondre les files qui vous intéressent, et l'en-tête s'adaptera (au premier file traité).