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

Posté par . Licence CC By‐SA.
Étiquettes : aucune
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 à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.