Commande awk pour récupérer valeurs sur ligne

Résolu/Fermé
marco.marco Messages postés 29 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 29 novembre 2013 - 23 févr. 2010 à 15:18
marco.marco Messages postés 29 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 29 novembre 2013 - 23 févr. 2010 à 19:19
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 !!
A voir également:

5 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
23 févr. 2010 à 15:23
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
23 févr. 2010 à 15:24
C'est plus propre comme ça :

sed 's/|$//;s/|/\n/g' plop | sort -u
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
23 févr. 2010 à 15:34
Salut,

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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
23 févr. 2010 à 15:44
;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
23 févr. 2010 à 15:32
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
marco.marco Messages postés 29 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 29 novembre 2013 1
23 févr. 2010 à 17:18
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
23 févr. 2010 à 18:30
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
23 févr. 2010 à 18:36
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
marco.marco Messages postés 29 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 29 novembre 2013 1
23 févr. 2010 à 19:19
Ca marche pour les deux :-)
Je garde perl du coup, c'est plus clair (et plus classe ;-))

Encore merci !!
0