Forum des développeurs  

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é.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell

Shell Vos questions sur l'utilisation des commandes shell

Réponse
 
Outils de la discussion
Vieux 05/08/2008, 14h48   #1 (permalink)
Membre actif
 
Date d'inscription: février 2005
Localisation: Vienne (38)
Messages: 177
Par défaut [awk] Utiliser plusieurs FS sur une même ligne

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 :
Code :
	for (i=1; i<=NF; i++) 
	{
		if (i > 1)
		{
			if(line) line=line":"$i
			else line=$i
		}
	}
pour reconstruire DATA, en ajoutant des ":" entre les champs si besoin, que je mémorise dans une variable nommée "line"
- 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
		}
	}
Beaucoup de blabla, désolé, merci à ceux qui m'ont suivi jusque là...

Toute idée est la bienvenue, et si je trouve une solution, je vous tiens au courant

Cordialement,

mathias
novices est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 06/08/2008, 18h45   #2 (permalink)
Modérateur
 
Avatar de gangsoleil
 
Date d'inscription: mai 2004
Localisation: Grenoble
Âge: 28
Messages: 2 642
Par défaut

Bonjour,

je ne suis pas certain d'avoir très bien compris ce que tu souhaites faire :
  • Découper une même ligne selon plusieurs séparateurs. Par exemple sur les caractères '.' et ':', si on l'applique à "Ceci est un exemple : il n'est . pas cohérent", tu chercher à obtenir :
    • Ceci est un exemple
    • Il n'est
    • pas cohérent
  • Découper une même ligne selon plusieurs séparateurs, mais de manière unique pour chaque séparateur. avec l'exemple précédent, tu aurais :
    • Pour :
      • Ceci est un exemple
      • Il n'est . pas cohérent
    • Pour .
      • Ceci est un exemple il n'est
      • pas cohérent

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
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide


Fuseau horaire GMT +1. Il est actuellement 01h18.


Publiez vos articles, tutoriels et cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter
Copyright 2000-2008 www.developpez.com - Legal informations