Commande awk pour récupérer valeurs sur ligne

Résolu
Bonjour,

Voilà mon problème: je récupère sous forme de variable ou de fichier des données du stype :

MACHIN001|MACHIN002|MACHIN003|MACHIN001|MACHIN006
MACHIN003|MACHIN007|
MACHIN008|MACHIN002|

etc...

donc sur plusieurs colonnes et plusieurs lignes avec un séparateur "|".

Ce que je voudrais faire c'est via une commande awk par exemple, lister toutes ces valeurs pour ne les avoir que sur une seule colonne :

MACHIN001
MACHIN002
MACHIN003
MACHIN004
MACHIN005
MACHIN006
...

(je terminerai mon awk par un " sort | uniq" pour virer les doublons)

Quelqu'un aurait-il la réponse ? Je sèche un peu...
Je travaille sous une machine unix.

Merci d'avance !!
Configuration: Windows XP / Firefox 3.6

5 réponses

  1. Modérateur
    Salut,

    Et avec "sed" ?

    jp@MDK:~/tmpfs ssh$ cat plop
    MACHIN001|MACHIN002|MACHIN003|MACHIN001|MACHIN006
    MACHIN003|MACHIN007|
    MACHIN008|MACHIN002|
    
    jp@MDK:~/tmpfs ssh$ sed 's/|/\n/g' plop | sed '/^$/d' | sort -u
    MACHIN001
    MACHIN002
    MACHIN003
    MACHIN006
    MACHIN007
    MACHIN008
    
    jp@MDK:~/tmpfs ssh$

    ;-))
    0
    1. Modérateur
      C'est plus propre comme ça :

      sed 's/|$//;s/|/\n/g' plop | sort -u
      0
    2. Modérateur
      @jipicySalut,

      Il faut gérer la ligne vide

      lami20j@debian-acer:~$ cat plop
      MACHIN001|MACHIN002|MACHIN003|MACHIN001|MACHIN006
      MACHIN003|MACHIN007|
      MACHIN008|MACHIN002| 
      lami20j@debian-acer:~$ sed 's/|$//;s/|/\n/g' plop | sort -u
       
      MACHIN001
      MACHIN002
      MACHIN003
      MACHIN006
      MACHIN007
      MACHIN008
      lami20j@debian-acer:~$ sed 's/^|\|| *$//g;s/|/\n/g' plop |sort|uniq
      MACHIN001
      MACHIN002
      MACHIN003
      MACHIN006
      MACHIN007
      MACHIN008


      Edit:
      En fait quand j'ai fait copier coller il avait des espaces après le dernier |
      0
    3. Modérateur
      @lami20j;-))
      0
  2. Modérateur
    Salut,

    lami20j@debian-acer:~$ cat plop 
    MACHIN001|MACHIN002|MACHIN003|MACHIN001|MACHIN006
    MACHIN001|MACHIN002|MACHIN003|MACHIN001|MACHIN006
    MACHIN003|MACHIN007|
    MACHIN008|MACHIN002| 
    lami20j@debian-acer:~$ sed 's/^|\|| *$//g;s/|/\n/g' plop |sort|uniq
    MACHIN001
    MACHIN002
    MACHIN003
    MACHIN006
    MACHIN007
    MACHIN008
    lami20j@debian-acer:~$ 

    0
    1. Merci Jipicy et lami20j !!!!

      vous m'aviez déjà sauvé la vie le mois dernier avec une commande awk ;-)

      \n : comment je n'y ai pas pensé !!!! je l'utilise dans tous mes shells (mais jamais avec un sed remarque)

      Bon ca marche impec sous linux mais pas sur unix...

      sous unix j'ai ca :
      MACHIN001nMACHIN002nMACHIN003nMACHIN001nMACHIN006

      Curieux... mais ce n'est pas grave du tout puisque de toute facon au final je vais l'utiliser sous un linux.

      Encore merci à vous deux !
      0
      1. Modérateur
        Re,

        Bon ca marche impec sous linux mais pas sur unix...

        Essai avec awk
        $ cat plop 
        MACHIN001|MACHIN002|MACHIN003|MACHIN001|MACHIN006
        MACHIN003|MACHIN007|
        MACHIN008|MACHIN002| 
        $ awk -F"|" '{for(i=1;i<=NF;++i) if($i~/MACH/) print $i|"sort|uniq"}' plop
        MACHIN001
        MACHIN002
        MACHIN003
        MACHIN006
        MACHIN007
        MACHIN008

        0
        1. Modérateur
          Re,

          Ou
          $ awk -F"|" '{for(i=1;i<=NF;++i) if(length($i)>1) print $i|"sort|uniq"}' plop
          MACHIN001
          MACHIN002
          MACHIN003
          MACHIN006
          MACHIN007
          MACHIN008

          Petit bonus avec perl ;-), qui normalement doit fonctionner sous unix

          $ cat plop
          MACHIN001|MACHIN002|MACHIN003|MACHIN001|MACHIN006
          MACHIN003|MACHIN007|
          MACHIN008|MACHIN002| 
          $ perl -pe 's/\|\s*/\n/g' plop|sort|uniq
          MACHIN001
          MACHIN002
          MACHIN003
          MACHIN006
          MACHIN007
          MACHIN008

          0
          1. Ca marche pour les deux :-)
            Je garde perl du coup, c'est plus clair (et plus classe ;-))

            Encore merci !!
            0