Forum Programmation.shell awk : Tri de lignes et affichage de noms

Posté par . Licence CC by-sa.
Tags : aucun
1
13
août
2019

Bonjour,

C'est encore moi… Je viens vous refaire un petit coucou suite à un ancien post pour lequel vous m'aviez bien aidé ( Celui ci )

Pour replacer le contexte : J'ai developpé une CGI en bash/html. Via cette interface je dois afficher le résultat du traitement de 276 fichiers CSV.

Mes fichiers csv resssemblent à cela !


MO2PPC20;mo2vio20b;Running;VIOS 2.2.5.20;7;1.0;2;DefaultPool;shared;uncap;192
MO2PPC20;mo2vio20a;Running;VIOS 2.2.5.20;7;1.0;2;DefaultPool;shared;uncap;192 
MO2PPC21;mplaix0311;Running;AIX 7.1 7100-05-02-1832;35;0.6;4;DefaultPool;shared;uncap;64 
MO2PPC21;miaibv194;Running;AIX 6.1 6100-09-11-1810;11;0.2;1;DefaultPool;shared;uncap;64 
MO2PPC21;mplaix0032;Running;AIX 6.1 6100-09-11-1810;105;4.0;11;DefaultPool;shared;uncap;128 
MO2PPC21;mplaix0190;Running;Unknown;243;4.9;30;DefaultPool;shared;uncap;128 
MO2PPC21;mo2vio21b;Running;VIOS 2.2.6.10;6;1.5;3;DefaultPool;shared;uncap;192 
MO2PPC21;miaibv238;Running;AIX 7.1 7100-05-02-1810;10;0.5;1;DefaultPool;shared;uncap;64 
MO2PPC21;mo2vio21a;Running;VIOS 2.2.6.10;6;1.5;3;DefaultPool;shared;uncap;192 
MO2PPC21;miaibv193;Running;AIX 6.1 6100-09-11-1810;12;0.2;1;DefaultPool;shared;uncap;64 
MO1PPC17;miaibe03;Running;AIX 5.2 5200-10-08-0930;25;null;3;null;ded;share_idle_procs;null 
MO1PPC17;miaiba12;Running;AIX 5.2 5200-10-08-0930;17;null;2;null;ded;share_idle_procs;null 
MO1PPC17;miaibf03;Running;AIX 5.2 5200-10-08-0930;30;null;3;null;ded;share_idle_procs;null 
MO1PPC17;miaibc05;Running;AIX 5.2 5200-10-08-0930;40;null;2;null;ded;share_idle_procs;null

Parmis toutes ces lignes ( il y en a beaucoup, beaucoup plus en réalité ), je n'ai besoin que des colonnes 1,2,5,6 et 7. Pour cela, ça va, je sais suffisamment utiliser awk pour ne garder que ces colonnes.

Il se trouve que je n'avais pas bien compris la " consigne ". Dans mon précédent post, j'affichais le contenu de tous mes fichiers csv. Or, certaines lignes sont identiques d'un fichier un autre ( Si pour un même LPARS, la consommation en RAM/CPU est la même pour le Lundi que pour le vendredi, il y aura donc la même ligne dans le fichier du Lundi que dans celui du Vendredi ).

Je ne dois justement pas afficher le contenu de ces lignes, puisque celles qui m'intéressent, ce sont les lignes où il y a une différence. J'ai donc cherché le moyen de supprimer les lignes qui sont identiques et je suis tombé sur cette commande :


awk '!a[$0]++'

Voici le script que j'utilise actuellement et dont vous avez été nombreux à corriger :


echo "<table>"
for fn in /var/www/cgi-bin/LPAR_MAP/*;
do
echo "<td>"
echo "<PRE>"
awk -F',|;' -v test="$test" ' 
     NR==1 {
        split(FILENAME ,a,"[-.]");
      }
     $0 ~ test  {
          if(!header++){
              print "DATE ========================== : " a[4] 
          }
          print ""
          print "RAM : " $5
          print "CPU 1 : " $6
          print "CPU 2 : " $7
          print "" 
          print ""
      }' $fn;

echo "</PRE>"
echo "</td>"
done
echo "</table>"

Avec cette boucle for, ça me permet d'afficher le contenu de mes fichiers CSV dans un tableau HTML. Chaque " Date ======== " est égal à une nouvelle colonne. Vous constaterez certaines modifications, notamment le fait que je supprime les colonnes vides et le fait que j'utilise le split pour ne garder que la partie qui m'intéresse dans le nom du fichier.

Ce qui donne comme résultat :

image_1

 
Comme je n'arrivais pas à intégrer la commande awk '!a[$0]++' dans ce script, je me suis dit que j'allais mettre celui-ci de côté et recommencer. Voici ce que j'ai pour le moment :


echo "<table>"
echo "<td>"
echo "<PRE>"

awk -F',|;' '{ $0=$1","$2","$5","$6","$7} /'$test'/{ if (!a[$0]++) 
{
print "DATE ======= FILENAME " FILENAME
printf "LPARS : %s\n", $2
printf "RAM : %s\n", $3
printf "CPU1 : %s\n", $4
printf "CPU2 : %s\n", $5
print ""
}
}' /var/www/cgi-bin/LPAR_MAP/*.csv

echo "</PRE>"
echo "</td>"
echo "</table"


Je n'affiche que les lignes qui ne sont pas identiques. Voici le résultat :

image_2

Ici vous ne voyez que des informations appartenant au fichier /var/www/cgi-bin/LPAR_MAP/PowerSys-LPARmap-20180122.csv, c'est normal, c'est juste qu'il y a plus d'informations pour ce fichier que pour les autres. Mais si je scrolle un peu plus je vois bien les autres dates.

Les problèmes sont les suivants :

  • J'arrive à afficher ce que je veux dans une colonne HTML… Mais dans une colonne seulement. Or, j'aimerais faire comme pour mon premier script, faire une colonne par " DATE ======= ".
  • Je n'arrive pas à utiliser le split dans cette situation.

Bizzarement, si j'ajoute :

split(FILENAME,a,"[-.]"); print "DATE ================= : " a[4]

Juste avant ma série de print, j'obtiens beaucoup plus de contenu que quand je fais un print de la variable FILENAME

Auriez-vous encore la gentillesse de m'expliquer ce qui ne va pas et comment corriger celà ?

Merci d'avance !

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.