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 :

Commande SED récalcitrante


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    responsable machine à café
    Inscrit en
    Janvier 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : responsable machine à café

    Informations forums :
    Inscription : Janvier 2009
    Messages : 54
    Par défaut Commande SED récalcitrante
    Bonjour,

    je parcours l'ensemble des forums et tuto depuis plusieurs heures et je n'arrive à arriver à mes fins concernant une commande SED.
    Je dispose d'un fichier qui contient des caractères alphanumériques.
    Je recherche uniquement les lignes qui ont la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            10  9.3145E-03  6.8459E-05  6.7935E-08  1.0000E-01  1.6482E-01  2.0000E+00  6.8407E-01  3.6805E-01    0    1          0    1
            10         NaN  6.8459E-05  6.7935E-08  1.0000E-01  1.6482E-01  2.0000E+00  6.8407E-01  3.6805E-01    0    1          0    1
            10  9.3145E-03         Nan  6.7935E-08  1.0000E-01  1.6482E-01  2.0000E+00  6.8407E-01  3.6805E-01    0    1          0    1
    Le 1er nombre est un entier qui démarre à 1.
    Il y a ensuite 8 valeurs en notation scientifique (ou NaN)
    Puis 4 valeurs entières.

    Auriez-vous une commande SED qui fonctionne svp ?
    J'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^[0-9E .-]\+$/p' test.txt
    mais cela retourne également des lignes qui ne m'intéresse pas du genre :
    ou
    Merci d'avance

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 339
    Par défaut
    Bonjour,
    Pas testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/[0-9]\+ \+\([0-9]\+\.[0-9]\+E[-+][0-9]\+ *\|[Nn][Aa][Nn] *\)\{8\}\( \+[0-9]\+\)\{4\}/p'

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -rn '/^[ \t]*[1-9][0-9]*[ \t]+(([0-9]+\.[0-9]+E[+-][0-9]+|Na[nN])[ \t]+){8}([0-9]+[ \t]+){3}[0-9]+[ \t]*$/p' fichier
    • la phrase commence éventuellement par plusieurs espaces ou tabulations : ^[ \t]*
    • le 1er nombre est un entier qui démarre à 1 : [1-9][0-9]*[ \t]+
    • il y a ensuite 8 valeurs en notation scientifique (ou NaN) : (([0-9]+\.[0-9]+E[+-][0-9]+|Na[nN])[ \t]+){8}
    • puis 4 valeurs entières : ([0-9]+[ \t]+){3}[0-9]+
    • on envisage en fin de ligne des espaces ou des tabulations éventuels : [ \t]*$


    concernant les 8 champs principaux sur la ligne :
    • soit on a un nombre en notation scientifique :
      • un ou plusieurs chiffres [0-9]+
      • suivis d'un point \.
      • suivi d'un ou plusieurs chiffres [0-9]+
      • suivis d'un E lui même suivi d'un caractère + ou - donc : E[+-]
      • suivis d'un ou plusieurs chiffres [0-9]+
    • soit un simple "NaN", avec éventuellement la dernière lettre en minuscule "Nan" (cf ton exemple) Na[nN]
    • donc l'alternative s'écrit (soit nb scientifique|soit NaN)
    • suite à quoi on trouve à nouveau un ou plusieurs espaces ou tabulations [ \t]+
    • le tout est répété 8 fois ((nbsci|NaN)espaces){8}

  4. #4
    Membre confirmé
    Profil pro
    responsable machine à café
    Inscrit en
    Janvier 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : responsable machine à café

    Informations forums :
    Inscription : Janvier 2009
    Messages : 54
    Par défaut
    Merci pour vos réponses.

    La solution de disedorgue n'a pas fonctionné chez moi.
    Bufferbob, ta méthode est très bien expliquée je te remercie.
    Elle n'a cependant pas marché directement chez moi : j'ai dû légèrement la modifier pour prendre en compte la possibilité d'avoir une valeur négative dans les 8 champs en notation scientifique (que j'avais oublié de préciser ...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sed -rn '/^[ \t]*[1-9][0-9]*[ \t]+(([-0-9]+\.[0-9]+E[+-][0-9]+|Na[nN])[ \t]+){8}([0-9]+[ \t]+){3}[0-9]+[ \t]*$/p' fichier
    ou peut être plus propre :
    sed -rn '/^[ \t]*[1-9][0-9]*[ \t]+(([-]*[0-9]+\.[0-9]+E[+-][0-9]+|Na[nN])[ \t]+){8}([0-9]+[ \t]+){3}[0-9]+[ \t]*$/p' fichier

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    ok, effectivement je n'y avais pas pensé

    effectivement on peut considérer [-]* comme étant plus propre que [-0-9], de manière plus simple tu aurais même pu écrire -* sans les crochets, mais pour faire vraiment propre il faut mettre -?, le point d'interrogation signifie que le caractère qui précède est optionnel

  6. #6
    Membre confirmé
    Profil pro
    responsable machine à café
    Inscrit en
    Janvier 2009
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : responsable machine à café

    Informations forums :
    Inscription : Janvier 2009
    Messages : 54
    Par défaut
    ha oui effectivement c'est encore mieux

    Encore merci pour ton aide.
    Bonne journée

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

Discussions similaires

  1. Problème avec la commande sed
    Par JUSTIN Loïc dans le forum Linux
    Réponses: 2
    Dernier message: 05/09/2006, 10h17
  2. Aide sur les commandes sed et awk
    Par elkhy dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 20/06/2006, 08h22
  3. La commande sed
    Par ajsd0208 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 26/04/2006, 14h34
  4. Commande SED
    Par pierregag dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 17/03/2006, 12h51
  5. [JDBC] Commande SQL récalcitrante
    Par Dahu dans le forum JDBC
    Réponses: 7
    Dernier message: 05/04/2005, 16h03

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