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] Extraire chaine jusqu'à la première occurrence d'un caractère "." ?


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
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut [awk] Extraire chaine jusqu'à la première occurrence d'un caractère "." ?
    Bonjour à tous;
    Je souhaite extraire la sous-chaine du champs $1 pour la comparer.
    Par exemple si j'ai un champs $1 du type "123456.123", je voudrais effectué une comparaison sur 123456 et ne traiter que les lignes qui disposent d'une sous chaine supérieure à 123456.

    En codage si mon champs $1 est de taille fixée à 10, mon code serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    awk '{
    if (substr($1,1,10) >= <un_autre_entier>) { print $1 } 
    '}
    En clair comment remplacer 10 par l'index de la première occurrence du "." dans mon champs $1 ?

    Merci pour votre aide.

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut première approche
    Salut

    A priori, tu te compliques la vie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      awk '(int($1)>123456) {print $1}' initial.txt
    Citation Envoyé par initial.txt
    123456.123 Toto va au marché
    123456.125 Toto va aux marchés
    123457.123 Il achète une carotte
    123457.125 Il achète des carottes
    123458.123 Les carottes sont cuites
    Si tu imprimes $0:
    Citation Envoyé par résultat
    123457.123 Il achète une carotte
    123457.125 Il achète des carottes
    123458.123 Les carottes sont cuites
    Si tu imprimes $1:
    Citation Envoyé par résultat
    123457.123
    123457.125
    123458.123

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut
    Hmm "int()" ... Merci Flodelarab !

    En fait le champs $1 (=123456.123) serait comparé avec un timestamp (=`date +%s`) placé en paramètre de ma fonction (script SH).

    function test_comp()
    {
    awk '(int($1)>'"$1"') {print $1}' test.txt
    }

    Il faut que je cast le `date +%s` en int aussi avant de la placé en paramètre ou pas ?

    Merci à vous

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    D'où vient ce timestamp?
    Pourquoi le compares-tu à un nombre à virgule si c'est un nombre entier de secondes?
    Utilises-tu awk ou gawk? (gawk a des fonctions pour ta question)
    Peux-tu donner un exemple moins flou de l'objectif final?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut
    Bonjour Flodelarab et merci pour ton aide;

    Et bien le timestamp (secondes écoulées depuis le 01/01/1970... je crois me rappeler..) placé en paramètre de ma fonction (lancée dans le "main" sh) est = à `date "+%s"`.

    Les chiffres après le "." correspondent au millisecondes du champs #1 du fichier mis en entrée de awk. Mais la prise en compte de ces millisecondes lors du "test if" ne m'intéresse pas (je peux me passer de cette précision).

    Je pourrais tester gawk si c'est interprétable depuis un shell SH. Quelle est cette fonction ?

    Le but final est de ne traiter que les lignes de champs #1 tel que $1 (premier paramètre de ma fonction= `date '1days ago' +"%s"` dans le "main") soit inférieure au < timestamp de la ligne qui est en fait (exemple de ligne d'un fichier en entrée de awk):
    "
    1363769742.377 42 10.31.254.160 TCP_REFRESH_HIT/200 487 GET http://www.fr/img/popup/right1.gif "loginAD" DIRECT/www.lfr image/gif MONITOR_CUSTOMCAT_11-Telechargements_autorises_comptes_AD-DefaultGroup-NONE-NONE-NONE-DefaultGroup <C_Tele,0.0,0,"-",0,0,0,1,"-",-,-,-,"-",1,-,"-","-",-,-,IW_gov,-,"-","-","Unknown","Unknown","-","-",92.76,0,-,"-","-"> - Request_size 716

    "


    Merci pour ton aide !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 155
    Par défaut
    Bien sur mon soucis c'est que timestamp ne fait qu'augmenter.
    Pour le moment il est sur 10 digits... donc je faisais une comparaison avec un subtr($1,1,10) mais le temps fait que mon script va devenir obsolete... :/
    d'ou le fait de prendre le "." comme "fin de timestamp"

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par Moostiq Voir le message
    Hmm "int()" ... Merci Flodelarab !

    En fait le champs $1 (=123456.123) serait comparé avec un timestamp (=`date +%s`) placé en paramètre de ma fonction (script SH).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function test_comp()
    {
      awk '(int($1)>'"$1"') {print $1}' test.txt
    }
    Il faut que je cast le `date +%s` en int aussi avant de la placé en paramètre ou pas ?

    Merci à vous
    A priori, je dirais oui:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function test_comp()
    {
      awk '(int($1)>int('"$1"')) {print $0}' test.txt
    }

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

Discussions similaires

  1. [RegEx] Supprimer jusqu'à la première occurrence d'une expression
    Par sergeh dans le forum Langage
    Réponses: 2
    Dernier message: 14/10/2014, 15h49
  2. Extraire chaine de caractères BATCH ou AWK
    Par LuffyyffuL dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 07/02/2011, 20h02
  3. [RegEx] Extraire les n premiers caractères d'1 chaine jusqu'à un espace
    Par lolymeupy dans le forum Langage
    Réponses: 7
    Dernier message: 29/04/2008, 19h22
  4. Extraire chaine de caractere
    Par killuaster dans le forum Langage
    Réponses: 3
    Dernier message: 18/12/2006, 10h10
  5. Awk extraire une partie d'un fichier
    Par titexe dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2006, 11h54

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