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

Solaris Discussion :

awk/nawk : utiliser RS avec plusieurs caractères


Sujet :

Solaris

  1. #1
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    mai 2004
    Messages
    9 981
    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 : 9 981
    Points : 27 468
    Points
    27 468
    Par défaut awk/nawk : utiliser RS avec plusieurs caractères
    Bonjour,

    Sous Linux ou AIX, j'utilise awk avec RS pour récupérer plusieurs lignes à la fois. Et bien évidemment, nawk de Solaris ne supporte pas d'avoir plusieurs caractères dans RS (mais on se demande vraiment à quoi ça sert dans ce cas), et awk n'a pas l'air d'apprécier non plus, ce qui fait que je me retrouve coincé...

    Exemple de fichier test.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    blabla
    "serveur1" id=42
     non "encore du blabla"
    bla bla MIN=2 bla bla
    "serveur1" id=43
     non "encore du blabla"
    bla bla MIN=1 bla bla
    "serveur1" id=44
     non "encore du blabla"
    bla bla MIN=4 bla bla
    pleins de bla bla inutile
    Ce que je veux récupérer : la valeur de MIN et de id, si MIN > 1.

    Code qui fonctionne sous Linux et AIX

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     awk 'BEGIN { RS="\n\"" ; FS="[ \t=]" } { for (i=0 ; i<NF ; i++) { if ($i=="MIN" && $(i+1) > 1 ) { printf $(i+1) " " $3} } }' test.txt
    Sauf que sous Solaris, eh bien il ne veut vraiment pas... : awk ne retourne rien du tout, et nawk ne supporte pas plusieurs caracteres dans RS....

    Donc si vous avez une idée, je suis preneur, parce que je ne vois vraiment plus comment faire. Sachant que bien sur je ne peux rien installer sur les machines, donc je suis super limité... Ah, on me souffle qu'il y a python si ca aide...
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 2 695
    Points : 7 880
    Points
    7 880
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Et bien évidemment, nawk de Solaris ne supporte pas d'avoir plusieurs caractères dans RS (mais on se demande vraiment à quoi ça sert dans ce cas)
    nawk supporte d'avoir plusieurs caractères dans le RS car le standard POSIX indique que c'est possible. Il ne fait rien des autres caractères que le premier car le standard POSIX ne précise pas ce qui doit être fait ...
    Donc si vous avez une idée, je suis preneur, parce que je ne vois vraiment plus comment faire. Sachant que bien sur je ne peux rien installer sur les machines, donc je suis super limité...
    Il suffit de faire deux passes, pas exemple comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nawk '
    fs == 1 {printf("\07\n");fs=0}
    /"$/ { fs=1 }
    1
    ' test.txt | nawk 'BEGIN { RS="\07" ; FS="[ \t=]" } { for (i=0 ; i<NF ; i++) { if ($i=="MIN" && $(i+1) > 1 ) { printf $(i+1) " " $3} } }'
    ɹǝsn *sıɹɐlos*

  3. #3
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    mai 2004
    Messages
    9 981
    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 : 9 981
    Points : 27 468
    Points
    27 468
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    nawk supporte d'avoir plusieurs caractères dans le RS car le standard POSIX indique que c'est possible. Il ne fait rien des autres caractères que le premier car le standard POSIX ne précise pas ce qui doit être fait ...
    Issu du man sur ma plateforme :
    RS The first character of the string value of
    RS is the input record separator; a newline
    character by default. If RS contains more
    than one character, the results are unspeci-
    fied. If RS is null, then records are
    separated by sequences of one or more blank
    lines. Leading or trailing blank lines do
    not produce empty records at the beginning
    or end of input, and the field separator is
    always newline, no matter what the value of
    FS.
    Merci pour ta solution, ça semble fonctionner, à un détail près : FS ne supporte pas le fait d'avoir plusieurs caractères dans une regex chez moi... Oui, je sais, l'environnement est étrange, mais je n'y peux pas grand chose...

    Pour ma part, j'étais parti sur RS="", et je me retrouve avec le même résultat que toi, à savoir un soucis à cause de ce FS qui ne comprend pas qu'il faut couper sur " " ET sur "=" ET sur "\t"...
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2007
    Messages : 2 695
    Points : 7 880
    Points
    7 880
    Par défaut
    La page de manuel de nawk reprends à quelques nuances de présentation près le standard POSIX:

    RS
    The first character of the string value of RS shall be the input record separator; a <newline> by default. If RS contains more than one character, the results are unspecified. If RS is null, then records are separated by sequences consisting of a <newline> plus one or more blank lines, leading or trailing blank lines shall not result in empty records at the beginning or end of the input, and a <newline> shall always be a field separator, no matter what the value of FS is.
    Je n'ai pas bien compris le problème qui subsiste avec RS. Peux-tu donner un exemple de fichier en entrée et la sortie obtenue puis souhaitée ?
    ɹǝsn *sıɹɐlos*

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    mai 2004
    Messages
    9 981
    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 : 9 981
    Points : 27 468
    Points
    27 468
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Je n'ai pas bien compris le problème qui subsiste avec RS. Peux-tu donner un exemple de fichier en entrée et la sortie obtenue puis souhaitée ?
    Pas avec RS, avec FS

    Exemple sur le fichier que j'ai mis au dessus, avec la solution que tu donnes affiche :

    Ici, deux soucis si j'interprète bien: il ne reconnait pas "\07" comme un caractère pour RS, et il prend "[" comme contenu de FS (le reste des caractères est ignoré). Si on affiche $0 dans le dernier print :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nawk '
    fs == 1 {printf("\07\n");fs=0}
    /"$/ { fs=1 }
    1
    ' test.txt | nawk 'BEGIN { RS="\07" ; FS="[ \t=]" } { for (i=0 ; i<NF ; i++) { if ($i=="MIN" && $(i+1) > 1 ) { printf "[" $0 "]" } } }'
    Ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [
    bla bla MIN=2 bla bla
    "serveur1" id=43
     non "encore du blabla"
    ][
    bla bla MIN=4 bla bla
    pleins de bla bla inutile
    ]

    Du coup, pour ma part, j'ai cherché avec RS="", et j'ai trouvé que si j'appelle awk -F"[ =]", le FS est bien interprété comme une expression régulière. D'où la solution suivante qui a l'air de fonctionner :
    Script test.awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    BEGIN {
      RS="" ;
    }
    {
      for (i=0 ; i<NF ; i++)
      {
        if ($i=="MIN" && $(i+1) > 1 )
        {
          j=1;
          while ($(i-j)!="id" && j<i )
          {
            j++;
          }
          if ($(i-j)=="id")
          {
            print $(i+1) " " $(i-j+1)
          }
        }
      }
    }
    Et l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nawk -F"[ =]" -f test.awk test.txt
    Et la sortie (reste un problème de formatage pas très grave a priori) :
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [awk] Extraire des champs avec plusieurs séparateurs différents
    Par leon1983 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 20/11/2013, 16h20
  2. [ZF 1.11] Utiliser Zend_PDF avec des caractères roumains
    Par Général03 dans le forum Autres composants
    Réponses: 1
    Dernier message: 16/12/2011, 12h02
  3. Comment utiliser FMod avec plusieurs cartes sons?
    Par NJKMASTER dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/11/2007, 11h43
  4. Chaine avec plusieurs caractères null
    Par Runik dans le forum SL & STL
    Réponses: 7
    Dernier message: 06/10/2007, 12h09
  5. Application utilisable avec plusieurs SGBD - ADO ou DBX ?
    Par RamDevTeam dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 08h25

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