Bonjour à tous,
Je cherche un moyen de découper plusieurs fois, suivant plusieurs critères de découpe (en fonction du FS donc), une même ligne.
Devant traiter plusieurs lignes d'un même fichier, il n'est pas possible d'utiliser awk deux fois de suite, du moins je ne pense pas.
Le but :
Je fais une recherche (grep) sur plusieurs fichiers, dont les noms peuvent prendre les formes suivantes :
DIR/X.Y.Z ou DIR/X.Y.Z.[0-9]
Si le fichier n'est pas suffixé par un numéro c'est qu'il s'agit de la version la plus récente, sinon le numéro final s'incrémente suivant la version.
Ces fichiers étant des copies d'autres fichiers, ils contiennent souvent la même chose, et donc grep me retourne souvent les mêmes lignes, à l'exception du nom du fichier.
Le résultat de grep est donc de la forme suivante :
DIR/X.Y.ZATA
DIR/X.Y.Z.0ATA
DIR/X.Y.Z.1ATA
...
Le résultat souhaité devra être de la forme suivante :
Y DATA
DATA peut prendre toutes les formes imaginables, et il faut que le résultat corresponde au contenu des fichiers, hormis pour les possibles tabluations et autres espaces blacs, qui peuvent se voir transformer en espaces.
L'idée que j'essaie d'appliquer est la suivante :
- découper sur les ":"
- mémoriser $1
- faire une boucle :
pour reconstruire DATA, en ajoutant des ":" entre les champs si besoin, que je mémorise dans une variable nommée "line"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 for (i=1; i<=NF; i++) { if (i > 1) { if(line) line=line":"$i else line=$i } }
- découper ensuite le $1 obtenu précédemment sur FS="." et n'afficher que $2, soit Y
- finir par afficher Y puis DATA avec un print Y, line
Le problème :
Les champs découpés lors de la découpe sur FS="." se retrouvent dans la reconstruction de DATA, avec des résultats qui changent suivant mes essais, mais invariablement, je retrouve ces champs supprimés dans ceux servant à la reconstruction...
Une idée que je vais tenter d'appliquer (qui vient de me sauter au neurone) serait de mémoriser le nombre de champs du découpage sur le "." pour le rajouter dans le for, un truc du genre :
Beaucoup de blabla, désolé, merci à ceux qui m'ont suivi jusque là...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 for (i=1; i<=NF; i++) { if (i > (1 + NF_sur_le_point)) { if(line) line=line":"$i else line=$i } }
Toute idée est la bienvenue, et si je trouve une solution, je vous tiens au courant
Cordialement,
mathias
Partager