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

Transformation liste en tableau avec ..awk ? [ Shell ] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 05-08-2014 à 14:25:15    

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 ?

Reply

Marsh Posté le 05-08-2014 à 14:25:15   

Reply

Marsh Posté le 05-08-2014 à 16:51:17    

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
Reply

Marsh Posté le 05-08-2014 à 16:58:15    

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 :(

Reply

Marsh Posté le 05-08-2014 à 17:47:42    

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.

Reply

Marsh Posté le 05-08-2014 à 18:06:13    

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
Reply

Marsh Posté le 05-08-2014 à 18:27:53    

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
Reply

Marsh Posté le 05-08-2014 à 18:39:23    

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 :)

Reply

Marsh Posté le 05-08-2014 à 19:25:58    

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
Reply

Marsh Posté le 06-08-2014 à 07:00:56    

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

Reply

Marsh Posté le 06-08-2014 à 17:47:36    


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

Reply

Marsh Posté le 06-08-2014 à 17:47:36   

Reply

Marsh Posté le 06-08-2014 à 17:48:01    

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:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed