[Shell/Unix] Tableaux

Tableaux [Shell/Unix] - Shell/Batch - Programmation

Marsh Posté le 16-12-2011 à 12:43:20    

Bonjour,  
 
Decidement, j'en pose des questions en prog shell :p
 
Soucis du jour, comment avoir un tableau tout bien, tout beau, bien aligné.
sachant que le nombre de ligne est variables, mais le nombre de colones fixes.
 
Au debut je passait par des print avec un \t en separateur, mais des qu'un des champs est trop long, ca decale.
 
J'ai essayer avec Awk, et j'ai trouver ceci :

Code :
  1. awk 'BEGIN { SUBSEP=":" } { for ( i=1 ; i <=NF ; i++ ) {tab[ NR , i ] = $i }} END { for ( i in tab ) { print tab[i]}} ' ./FIN.lst


Mais voici un extrait du resultat :

Code :
  1. BOXI
  2. :
  3. Gestion
  4. des
  5. logs
  6. debut
  7. session
  8. sauvegarde
  9. quotidienne
  10. QBOXI_
  11. Gestion
  12. des
  13. logs
  14. QBOXI_SAV
  15. BOSAV00DEB
  16. BO
  17. QROGELOG
  18. INCIDENTE
  19. ROLOG10GES


 
Alors que je devrait avoir un truc du genre :  

Code :
  1. SESSION          UPROC           APP     STATUS          FIN     HEURE   PDATE   LABEL
  2. QBOXI_SAV        BOSAV00DEB      BO      INCIDENTE       08/12/2011      21:00:01        08/12/2011      BOXI : debut session sauvegarde quotidienne QBOXI_
  3. QROGELOG         ROLOG10GES      RO      INCIDENTE       08/12/2011      20:00:06        08/12/2011      ROXY : Gestion des logs
  4. QBOXI_SAV        BOSAV00DEB      BO      INCIDENTE       09/12/2011      21:00:00        09/12/2011      BOXI : debut session sauvegarde quotidienne QBOXI_



---------------
Serveur HFR - OpenTTD
Reply

Marsh Posté le 16-12-2011 à 12:43:20   

Reply

Marsh Posté le 16-12-2011 à 14:29:01    

salut,
 
printf peut t'aider. Il faudra que tu surveilles le changement d'indice pour ajouter un retour à la ligne.

Reply

Marsh Posté le 16-12-2011 à 18:15:25    

j'avais essayer, mais j'avais tout sur une ligne du coup ... et j'ai pas trouver comment faire la separation de champs, ni le retour à la ligne.


---------------
Serveur HFR - OpenTTD
Reply

Marsh Posté le 16-12-2011 à 20:24:58    

tu as essayé avec split ?

Code :
  1. cat mon_fichier
  2. foo bar baz
  3. foo1 bar1 baz2
  4. awk '{split($0,array); for(i in array)printf(i<NF ? "\t%s" : "\t%s\n" ),array[i]}' mon_fichier
  5. foo bar baz
  6. foo2 bar2 baz2

Reply

Marsh Posté le 19-12-2011 à 14:11:26    

Ca marche presque, j'ai un decalage dans les lignes, et la dernière colone je devrais pas avoir autant d'espace entre les chaines  
 
Voici mon fichier de depart.

Code :
  1. SESSION          UPROC           APP     STATUS          FIN     HEURE   PDATE   LABEL
  2. QROGELOG         ROLOG10GES      RO      INCIDENTE       16/12/2011      20:00:04        16/12/2011      ROXY : Gestion des logs
  3. QBOXI_SAV        BOSAV00DEB      BO      INCIDENTE       16/12/2011      21:00:00        16/12/2011      BOXI : debut session sauvega
  4. rde quotidienne QBOXI_SAV
  5. QROGELOG         ROLOG10GES      RO      INCIDENTE       15/12/2011      20:00:06        15/12/2011      ROXY : Gestion des logs


 
Voici l'arrivé avec le Awk que tu m'a indiquer : (je maitrise vraiment pas le Awk)

Code :
  1. PROD_prodwh2_univadm $ awk '{split($0,array); for(i in array)printf(i<NF ? "\t%s" : "\t%s\n" ),array[i]}' ./FIN.lst
  2.         UPROC   APP     STATUS  FIN     HEURE   PDATE   LABEL
  3.         SESSION ROLOG10GES      RO      INCIDENTE       16/12/2011      20:00:04        16/12/2011      ROXY    :       Gestion des     logs
  4.         QROGELOG        BOSAV00DEB      BO      INCIDENTE       16/12/2011      21:00:00        16/12/2011      BOXI    :       debut   session sauvegarde      quotidienne     QBOXI_SAV
  5.         QBOXI_SAV       ROLOG10GES      RO      INCIDENTE       15/12/2011      20:00:06        15/12/2011      ROXY    :       Gestion des     logs


---------------
Serveur HFR - OpenTTD
Reply

Marsh Posté le 19-12-2011 à 16:39:33    

Code :
  1. awk '{split($0,array); for(i=1; i<=NF; i++)printf(int(i)<int(NF) ? "%s\t" : "%s\n" ),array[i]}'

mais, vu qu'il n'y a pas de délimiteur de champs, c'est pas formidable.

Reply

Sujets relatifs:

Leave a Replay

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