[awk] Extraire une donnée sur une ligne

Résolu
Bonjour !

Une petite colle pour les pros du awk (ou du sed, cut and co ;-)):
Je voudrais, sous linux/unix, extraire une donnée sur une ligne de type :

|donnée1: nombre1|donnée2: nombre2|donnée3: nombre3|donnée4: nombre4|

Il me faudrait dans cet exemple récupérer "nombre3" à partir de "donnée3".

Je pourrais le faire avec un awk du style
awk -F "|" '{print $3}'' | cut -d":" -f2
Mais ca impliquerait que je sache qu'il soit placé en 3ème position dans ma ligne ce qui n'est pas le cas, je ne connais que "donnée3". Et avec un grep de ce "donnée3" je récupère toute la ligne...

Qulqu'un pourrait m'aider ??

Merci !!!

4 réponses

  1. Modérateur
    Salut,

    2 passage avec grep

    grep -o 'donn.e3: nombre3' fichier|grep -o nombre3

    0
    1. Modérateur
      Salut,

      Avec "sed" :

      $ echo $A
      |donnée1: nombre1|donnée2: nombre2|donnée3: nombre3|donnée4: nombre4|
      $ echo $A | sed -n '/donnée3/s/.*donnée3: \([^|]*\).*/\1/p'
      nombre3

      ;-))
      0
      1. Modérateur
        Re,

        grep + sed ;-)

        grep -o 'donn.e3: nombre3' fichier|sed 's/.*: *//'
        0
      2. Modérateur
        Re-

        Il ne connait pas la valeur de "nombre3" ;-\
        0
      3. Modérateur
        Re,

        grep -o 'donn.e3: [^]*' fichier|sed 's/.*: *//'
        0
      4. Modérateur
        Manque le "pipe" ;-((

        grep -o 'donn.e3: [^|]*' fichier|sed 's/.*: *//'
        0
      5. Modérateur
        Ben, c'était pour voir si tu fais attention ;-)

        P.S. Pour eviter les malentendus, je dirais plutôt "le tube" ou "pipeline" ;-)))
        0
    2. Merci jipicy + lami20j :-)))))))))))

      Je m'égarais avec mon awk...
      Le grep -o ou le sed fonctionnent tous les 2, j'ai donc gardé le grep, un peu plus court (et un peu moins complexe pour moi ;-))
      J'ai juste du remplacer les premieres apostrophes, juste après le -o du grep, par des guillemets sinon ca ne passait pas: le "donnée3" est variabilisé...
      Et je me suis permis de remplacer le sed par un cut (histoire de dire que j'ai un peu bossé quand meme ;-))))), ce qui au final revient au meme...

      grep -o "${donnee3}:[^|]*" nom_fichier |cut -d":" -f2
      0
      1. Modérateur
        sed -n "s/.*${donnee3}: \([^|]*\).*/\1/p" fichier
        0
    3. Contributeur
      hello
      avec awk
      $ echo "|donnée1: nombre1|donnée2: nombre2|donnée3: nombre3|donnée4: nombre4| " | awk 'BEGIN {RS="[|:]"} ; /donnée3/ {getline;print}'
       nombre3
      $
      0