IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[awk] Utiliser plusieurs FS sur une même ligne


Sujet :

Shell et commandes GNU

  1. #1
    Membre habitué
    Inscrit en
    Février 2005
    Messages
    192
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 192
    Points : 198
    Points
    198
    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 : 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
    		}
    	}
    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 : 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
    		}
    	}
    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

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 121
    Points
    28 121
    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 = "[|/]";
    ...
    ....

Discussions similaires

  1. [AC-2003] Requete qui affiche plusieurs enregistrements sur une même ligne
    Par Stef999 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/12/2011, 16h19
  2. Plusieurs colonnes sur une même ligne
    Par LBO72 dans le forum SQL
    Réponses: 4
    Dernier message: 16/02/2011, 15h33
  3. [AC-2000] obtenir plusieurs enregistrements sur une même ligne
    Par woant dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/05/2009, 17h31
  4. comment écrire plusieurs instructions sur une même ligne ?
    Par Ekimasu dans le forum Général Python
    Réponses: 3
    Dernier message: 31/10/2008, 10h30
  5. [Tableaux] plusieurs tableaux sur une même ligne
    Par zugolin dans le forum Langage
    Réponses: 6
    Dernier message: 12/01/2008, 23h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo