Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3079 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [ Shell ] Transformation liste en tableau avec ..awk ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ Shell ] Transformation liste en tableau avec ..awk ?

n°1361885
paranoidan​droid
Posté le 05-08-2014 à 14:25:15  profilanswer
 

Bonjour,
 
Je pense que la manip est faisable avec du awk, mais j'ai plus vraiment la logique en tête ..
 
Je cherche à passer de ça :
 
ABC
123,546,789,123
456,879,321
,456,654,
DEF
213,897,741,321
564,87,654
GHI
564,897,546,213,657
 
à ça
 
ABC,123,546,789,123
ABC,456,879,321
ABC,,456,654,
DEF,213,897,741,321
DEF,564,87,654
GHI,564,897,546,213,657
 
Une idée ?

mood
Publicité
Posté le 05-08-2014 à 14:25:15  profilanswer
 

n°1361891
zipe31
Posté le 05-08-2014 à 16:51:17  profilanswer
 

Salut,
 
Avec sed c'est envisageable ? J'ai fait avec ce que tu nous a donné comme exemple.
 
Attention c'est assez imbuvable  :D  
 

$ cat script.sed  
#n
/^[[:digit:],]/ !{                      
    h                                  
    d                                  
}                                      
H                                      
g                                      
s/\n.*//                                
x                                      
s/\n/,/                                
p                                      
d

                               
 

$ sed -f script.sed plop  
ABC,123,546,789,123
ABC,456,879,321
ABC,,456,654,
DEF,213,897,741,321
DEF,564,87,654
GHI,564,897,546,213,657


 
 ;)  


---------------
$ man woman
n°1361892
Profil sup​primé
Posté le 05-08-2014 à 16:58:15  answer
 

salut,
 
avant de proposer une solution, je voudrais que tu dises ce qu'il faut faire, et pourquoi.
càd : retenir les lignes qui correspondent à un motif (il n'y a que des lettres (trois, ou plus ?), elles n'ont qu'un champs ? quoi d'autre ?), et préfixer toutes les suivantes, ou seulement quelques unes ?
 
mais bon, apparemment, zipe31 veut bien faire tes devoirs :(

n°1361897
paranoidan​droid
Posté le 05-08-2014 à 17:47:42  profilanswer
 

Le but et de transformer un output qui liste les relations luns / host d'une appliance de virtualisation de stockage.
 
Je ne cherche pas à obtenir le code gratos, je cherche juste la méthode. C'est un peu pour ça que j'ai pris des exemples bateau sur le 1er post.
 
La liste est composé d'un nom de serveur puis de la lun présentée à ce serveur, et cela pour tous les serveurs déclarés..
 
Serveur1
(0,NOM_LUN_0,UUID,SIZE)
(1,NOM_LUN_1,UUID,SIZE)
(2,NOM_LUN_2,UUID,SIZE)
 
Serveur2
(0,NOM_LUN_0,UUID,SIZE)
(1,NOM_LUN_1,UUID,SIZE)
 
Et ainsi de suite ..
 
Et je cherche à obtenir un tableau en mettant le nom de serveur devant chaque lun présenté.
 
En l'occurence :
 
(Serveur1,0,NOM_LUN_0,UUID,SIZE)
(Serveur1,1,NOM_LUN_1,UUID,SIZE)
(Serveur1,2,NOM_LUN_2,UUID,SIZE)
(Serveur2,0,NOM_LUN_0,UUID,SIZE)
(Serveur2,1,NOM_LUN_1,UUID,SIZE)
 
Peu importe la mise en forme à vrai dire.

n°1361898
paranoidan​droid
Posté le 05-08-2014 à 18:06:13  profilanswer
 

Les noms de serveurs étant normés (avec un "V_" en tant que préfixe), je les cherche dans chaque ligne, si je ne les trouve pas, j'affiche le dernier nom de serveur trouvé, et j'affiche toute la ligne avec).  
 
Merci pour la solution en sed au passage, je ne "script" que très rarement, je pense avoir déjà fait cette exercice en perl il y a plusieurs années ... plutôt simple comme problème.
 
La solution est peut être pas sexy, mais c'est fonctionnel, cf plus bas.
 
Exemple :
 

Code :
  1. [para]$ cat viewsexample
  2. /clusters/cluster-1/exports/storage-views/V_SOP_frsopseinf001:
  3. (1,VOL_SOP_frsopseinf001-002_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929ad,1T)
  4. (2,VOL_SOP_frsopseinf001-002_002_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929ae,1T)
  5. (3,VOL_SOP_frsopseinf001-002_003_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929ac,1T)
  6. /clusters/cluster-1/exports/storage-views/V_SOP_frsopseinf005:
  7. (1,VOL_SOP_frsopseinf005-006_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d99293b,1T)
  8. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslapp001:
  9. (0,VOL_SOP_frsopslapp001_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d992962,128G)
  10. (1,VOL_SOP_frsopslapp001_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d992964,0.25T)
  11. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslapp003:
  12. (0,VOL_SOP_frsopslapp003_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929a1,128G)
  13. (1,VOL_SOP_frsopslapp003_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929a2,128G)
  14. (3,VOL_SOP_frsopslapp003-004_003_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929a0,2G)
  15. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslapp005:
  16. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslbdd001:
  17. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslbdd003:
  18. (0,VOL_SOP_frsopslbdd003_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928c7,128G)
  19. (1,VOL_SOP_frsopslbdd003_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928c9,128G)
  20. (2,VOL_SOP_frsopslbdd003-004_002_3B2_T0D,VPD83T3:6000144000000010200d75d20d9928b3,128G)
  21. (3,VOL_SOP_frsopslbdd003-004_003_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928b5,128G)
  22. (4,VOL_SOP_frsopslbdd003-004_004_3B2_T0D,VPD83T3:6000144000000010200d75d20d9928b7,128G)
  23. (5,VOL_SOP_frsopslbdd003-004_005_3B2_T0D,VPD83T3:6000144000000010200d75d20d9928b9,8G)
  24. (6,VOL_SOP_frsopslbdd003-004_006_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928bb,8G)
  25. (7,VOL_SOP_frsopslbdd003-004_007_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928bd,2G)
  26. (8,VOL_SOP_frsopslbdd003-004_008_3B2_T0D,VPD83T3:6000144000000010200d75d20d9928bf,2G)
  27. (10,VOL_SOP_frsopslbdd003-004_010_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928c1,2G)
  28. (11,VOL_SOP_frsopslbdd003-004_011_X606_T1D,VPD83T3:6000144000000010200d75d20d9928c3,2G)
  29. (12,VOL_SOP_frsopslbdd003-004_012_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928c5,2G)
  30. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslbdd005:
  31. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslbdd007:
  32. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslbdd009:
  33. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslweb001:
  34. (0,VOL_SOP_frsopslweb001_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d99293c,96G)
  35. (1,VOL_SOP_frsopslweb001_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d99293d,80G)
  36. /clusters/cluster-1/exports/storage-views/V_SOP_frsopslweb003:
  37. (0,VOL_SOP_frsopslweb003_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d992940,96G)
  38. (1,VOL_SOP_frsopslweb003_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d992941,80G)


 
 
Traitement :
 

Code :
  1. [para]$ cat viewsexample | awk '{ if ($0 ~ "V_" ) split($0,viewpath,"/" ) ; else print viewpath[6], $0 }'
  2. V_SOP_frsopseinf001: (1,VOL_SOP_frsopseinf001-002_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929ad,1T)
  3. V_SOP_frsopseinf001: (2,VOL_SOP_frsopseinf001-002_002_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929ae,1T)
  4. V_SOP_frsopseinf001: (3,VOL_SOP_frsopseinf001-002_003_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929ac,1T)
  5. V_SOP_frsopseinf005: (1,VOL_SOP_frsopseinf005-006_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d99293b,1T)
  6. V_SOP_frsopslapp001: (0,VOL_SOP_frsopslapp001_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d992962,128G)
  7. V_SOP_frsopslapp001: (1,VOL_SOP_frsopslapp001_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d992964,0.25T)
  8. V_SOP_frsopslapp003: (0,VOL_SOP_frsopslapp003_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929a1,128G)
  9. V_SOP_frsopslapp003: (1,VOL_SOP_frsopslapp003_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929a2,128G)
  10. V_SOP_frsopslapp003: (3,VOL_SOP_frsopslapp003-004_003_3B2_T2D,VPD83T3:6000144000000010200d75d20d9929a0,2G)
  11. V_SOP_frsopslbdd003: (0,VOL_SOP_frsopslbdd003_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928c7,128G)
  12. V_SOP_frsopslbdd003: (1,VOL_SOP_frsopslbdd003_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928c9,128G)
  13. V_SOP_frsopslbdd003: (2,VOL_SOP_frsopslbdd003-004_002_3B2_T0D,VPD83T3:6000144000000010200d75d20d9928b3,128G)
  14. V_SOP_frsopslbdd003: (3,VOL_SOP_frsopslbdd003-004_003_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928b5,128G)
  15. V_SOP_frsopslbdd003: (4,VOL_SOP_frsopslbdd003-004_004_3B2_T0D,VPD83T3:6000144000000010200d75d20d9928b7,128G)
  16. V_SOP_frsopslbdd003: (5,VOL_SOP_frsopslbdd003-004_005_3B2_T0D,VPD83T3:6000144000000010200d75d20d9928b9,8G)
  17. V_SOP_frsopslbdd003: (6,VOL_SOP_frsopslbdd003-004_006_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928bb,8G)
  18. V_SOP_frsopslbdd003: (7,VOL_SOP_frsopslbdd003-004_007_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928bd,2G)
  19. V_SOP_frsopslbdd003: (8,VOL_SOP_frsopslbdd003-004_008_3B2_T0D,VPD83T3:6000144000000010200d75d20d9928bf,2G)
  20. V_SOP_frsopslbdd003: (10,VOL_SOP_frsopslbdd003-004_010_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928c1,2G)
  21. V_SOP_frsopslbdd003: (11,VOL_SOP_frsopslbdd003-004_011_X606_T1D,VPD83T3:6000144000000010200d75d20d9928c3,2G)
  22. V_SOP_frsopslbdd003: (12,VOL_SOP_frsopslbdd003-004_012_3B2_T2D,VPD83T3:6000144000000010200d75d20d9928c5,2G)
  23. V_SOP_frsopslweb001: (0,VOL_SOP_frsopslweb001_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d99293c,96G)
  24. V_SOP_frsopslweb001: (1,VOL_SOP_frsopslweb001_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d99293d,80G)
  25. V_SOP_frsopslweb003: (0,VOL_SOP_frsopslweb003_000_3B2_T2D,VPD83T3:6000144000000010200d75d20d992940,96G)
  26. V_SOP_frsopslweb003: (1,VOL_SOP_frsopslweb003_001_3B2_T2D,VPD83T3:6000144000000010200d75d20d992941,80G)


Message édité par paranoidandroid le 05-08-2014 à 18:07:42
n°1361900
zipe31
Posté le 05-08-2014 à 18:27:53  profilanswer
 

C'est quand même plus simple (et clair) en awk  ;)  
 
Je mets quand même la solution avec sed (sinon à quoi ça sert que Ducros il se décarcasse, hein ?  :D  ) :
 

#n
/^(/ !{                                
    s#.*/##                            
    h                                  
    d                                  
}                                      
H                                      
g                                      
s/\n.*//                                
x                                      
s/\n/ /                                
p                                      
d


---------------
$ man woman
n°1361903
paranoidan​droid
Posté le 05-08-2014 à 18:39:23  profilanswer
 

zipe31 a écrit :

C'est quand même plus simple (et clair) en awk  ;)  
 
Je mets quand même la solution avec sed (sinon à quoi ça sert que Ducros il se décarcasse, hein ?  :D  ) :
 

#n
/^(/ !{                                
    s#.*/##                            
    h                                  
    d                                  
}                                      
H                                      
g                                      
s/\n.*//                                
x                                      
s/\n/ /                                
p                                      
d



 
Merci beaucoup, vais essayer de traduire chaque instruction :)

n°1361906
zipe31
Posté le 05-08-2014 à 19:25:58  profilanswer
 

Explications :
 
#n
On imprime sur la sortie standard que sur demande (associé à la commande "p" en fin de script)
 
/^(/ !{
Si une ligne ne commence pas (le ! indique la négation) par une parenthèse ouvrante, on applique les commandes situées entre les accolades
 
    s#.*/##  
On commence par supprimer de la ligne tout ce qui se trouve avant le slash (slash y compris)
 
    h
On place le résultat dans la mémoire secondaire de sed
 
    d
Puis on efface le contenu de la mémoire principale. Le script recommence au début et charge une nouvelle ligne dans la mémoire principale.
 
}
Fin des commandes entre accolades
 
H
Ici, une nouvelle ligne a donc été chargée. Si la nouvelle ligne commence par une parenthèse, on l'ajoute à la mémoire secondaire à la suite de celle s'y trouvant déjà. Les deux lignes sont séparées par un caractère nouvelle ligne "\n".
 
g
On écrase le contenu de la mémoire principale par celui de la mémoire secondaire.
 
s/\n.*//
Puis on efface la ligne qu'on vient d'ajouter. Ça c'est pour conserver l'index qui nous intéresse.
 
x
On échange le contenu des 2 mémoires  
 
s/\n/ /            
On substitue le caractère saut de ligne (\n) par un espace
 
p  
Et on imprime la ligne sur la sortie standard
 
d
Puis on efface la mémoire principale et le script recommence au début.


---------------
$ man woman
n°1361934
Profil sup​primé
Posté le 06-08-2014 à 07:00:56  answer
 

Code :
  1. cat viewsexample | awk '{ if ($0 ~ "V_" ) split($0,viewpath,"/" ) ; else print viewpath[6], $0 }'

c'est simple et efficace, c'est bien !
 
deux petites remarques :  
- `cat' est inutile
- puisque tu veux le dernier champ du tableau viewpath, et que `split()' retourne le nombre d'éléments du tableau : `print viewpath[n]'
 

Code :
  1. awk '/V_/{n=split($0,S,"/" )}/^\(/{print S[n]" "$0}' tonFichier

n°1361959
paranoidan​droid
Posté le 06-08-2014 à 17:47:36  profilanswer
 


 
c'est pour l'exemple, le contenu est en fait un résultat de Curl
 
 
 
C'est effectivement plus classe :)

mood
Publicité
Posté le 06-08-2014 à 17:47:36  profilanswer
 

n°1361960
paranoidan​droid
Posté le 06-08-2014 à 17:48:01  profilanswer
 

zipe31 a écrit :

Explications :
 
#n
On imprime sur la sortie standard que sur demande (associé à la commande "p" en fin de script)
 
/^(/ !{
Si une ligne ne commence pas (le ! indique la négation) par une parenthèse ouvrante, on applique les commandes situées entre les accolades
 
    s#.*/##  
On commence par supprimer de la ligne tout ce qui se trouve avant le slash (slash y compris)
 
    h
On place le résultat dans la mémoire secondaire de sed
 
    d
Puis on efface le contenu de la mémoire principale. Le script recommence au début et charge une nouvelle ligne dans la mémoire principale.
 
}
Fin des commandes entre accolades
 
H
Ici, une nouvelle ligne a donc été chargée. Si la nouvelle ligne commence par une parenthèse, on l'ajoute à la mémoire secondaire à la suite de celle s'y trouvant déjà. Les deux lignes sont séparées par un caractère nouvelle ligne "\n".
 
g
On écrase le contenu de la mémoire principale par celui de la mémoire secondaire.
 
s/\n.*//
Puis on efface la ligne qu'on vient d'ajouter. Ça c'est pour conserver l'index qui nous intéresse.
 
x
On échange le contenu des 2 mémoires  
 
s/\n/ /            
On substitue le caractère saut de ligne (\n) par un espace
 
p  
Et on imprime la ligne sur la sortie standard
 
d
Puis on efface la mémoire principale et le script recommence au début.


 
Merci ..beaucoup ..  :jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [ Shell ] Transformation liste en tableau avec ..awk ?

 

Sujets relatifs
XFCE: afficher le menu des applications dans le tableau de bord ? Définir deux dates sur unix pour répertorier les données d'un tableau
[exp reg]liste des fichiers commençant par "annee4" et de 7 caractèresLinux shell compression archives
Questions shellArch : shell problème bindkey ?
boucle shell a 2 variable[ArchLinux/Manjaro] Obtenir la liste des programmes installés.
Script perl ou cmd linux pour transformation de format de texte[shell] script sauvegarde recuperer nom hote windows
Plus de sujets relatifs à : [ Shell ] Transformation liste en tableau avec ..awk ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR