![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| Shell Vos questions sur l'utilisation des commandes shell |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Membre actif
![]() Date d'inscription: février 2005
Localisation: Vienne (38)
Messages: 177
|
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.Z DIR/X.Y.Z.0 DIR/X.Y.Z.1 ... 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 : Code :
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 : Code :
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 |
|
|
|
|
|
#2 (permalink) |
![]() Date d'inscription: mai 2004
Localisation: Grenoble
Âge: 28
Messages: 2 642
|
Bonjour,
je ne suis pas certain d'avoir très bien compris ce que tu souhaites faire :
Le premier cas est possible, mais pas le second à ma connaissance. Pour le premier, il suffit de passer l'ensemble de tes séparateurs à FS : BEGIN { FS = "[|/]"; ... ....
__________________
Non au langage SMS Modérateur "C", "Informatique Générale & Hardware" et "Windows, Système & Logiciels" Les règles du forum |
|
|
|
![]() |
![]() |
||
[awk] Utiliser plusieurs FS sur une même ligne
|
||
| Outils de la discussion | |
|
|