vaf est un autre script qui me donne tous les fichiers donc j'ai besoin. Je le pipe dans un awk ou j'ai besoin de la 2eme et 3eme colonne. Et je le pipe dans une boucle car beaucoup d'entré et je dois comparer les 2 collones.
Mon problème c'est que je dois partager les information lue par awk et mon script. Je ne connais pas bien la programmation awk.
J'ai vue que je pouvais utilisé l'option -v . Mais je n'y arrive pas. Est-il possible d'avoir un truc du genre
$Varbash= $2 # #2 de awk
Existe il des autre fonction que print?
Ou puis apprendre convenablement awk car je comprend pas quand il faut écrire un script awk .
le problème, c'est que la commande vaf affiche une liste, et que chaque élément/ligne effacera les valeurs les précédentes.
quelle comparaison dois-tu effectuer ? sur quels éléments ? et quel est le résultat attendu en fonction de la comparaison pour quelques éléments représentatifs ?
je comprends que tu veuilles à ta façon, mais, en général, c'est une mauvaise idée qui amène à chaque étape plus de complications.
on peut forcer un cheval à faire ce qu'on veut, mais c'est alors un cheval auquel on ne lâchera jamais la bride, et qui n'aura jamais la souplesse, la beauté d'un cheval que l'on accompagne.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
La commande vaf n'affiche pas de liste car elle dispose de l'option -v . Mais elle parcour cette liste quand même d'ou le fait de vouloir lire ligne par ligne
Je dois comparer l'ancien fichier avec un nouveau. De manière à savoir si la version de se fichier à changer.
vaf -v ${oldsrv}| awk -F" " '{ print $2,$3}'|while read oldLine; #oldsrv
do
vaf -v ${newsrv}| awk -F" " '{ print $2,$3 }'|while read newLine;#newsrv
do
echo "Comparer la colonne $2 de oldLine avec la colonne $2 de newLine "
done
done
voilà l'implémentation que je voudrais. Peut-être que ma solution crains si tu as des idées
- Edité par Don_raftapss 10 novembre 2019 à 14:58:29
pour ça, je dois voir la sortie de la commande vaf.
là, pour chaque ligne de "vafOld", tu exécutes "vafNew", qui va sortir les mêmes données à chaque fois. ce n'est évidemment pas optimal, puisque l'objectif est de comparer les deux sorties.
mais sans la sortie, difficile d'en dire plus.
si tu ne fais rien d'autre avec awk, il n'est pas utile; read peux découper une ligne en "colonnes" :
# par exemple :
echo "a b c d e f g
A B C D E F G" | while IFS=' ' read x y z reste; do echo "y: $y; z: $z"; done
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
je chipote (si peu ), mais "une centaine de lignes", ça fait une liste.
il est donc bien question de comparer deux listes : diff peut faire ça avec des listes préalablement triées.
je récapitule pour qu'on comprenne la même chose :
tu as deux fichiers : old et new. chaque fichier (old/new) contient des références à des fichiers *.c et *.h, et *.dt visiblement ! la commande vaf affiche la liste de ces références
tu veux comparer les listes.
on peut imaginer un paste pour lire les listes côte à côte :
while IFS='|' read old new
do
oldAr=( $old )
newAr=( $new )
test "${oldAr[1]} ${oldAr[2]}" = "${newAr[1]} ${newAr[2]}" || { echo "différence trouvée"; break;}
done < <(paste -d '|' <(vaf -v "$oldFile") <(vaf -v "newFile"))
je n'ai pas de matériaux pour faire des tests et te proposer un script fonctionnel. c'est pourquoi il faut nous donner les listes de deux fichiers old/new, au moins en MP.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
J'ai un script fonctionnel avec le read. Et oui je voulais faire des liste aussi mais le server est un vieux server unix sans list ou alors je n'y arrive pas
Voici le script
vaf -v ${oldsrv}|while IFS=' ' read oldvss oldChemin oldVersion oldDate oldNom; #oldsrv
do
vaf -v ${newsrv}|while IFS=' ' read newvss newChemin newVersion newDate newNom;#newsrv
do
#echo "$oldVersion $newVersion "
if [ "$oldChemin" = "$newChemin" ]
then
if [ "$newVersion" != "$oldVersion" ]
then
echo "$oldChemin $oldVersion $newChemin $newVersion "
fi
fi
Cela fonctionne et d'ailleurs je t'en remercie.
Par contre le script que tu as mis la haut je suis complètement perdu !
Tu ne parcour que un seul fichier? Oui parce que en faite les fichier ne se trouve pas spécialement à la même place que dans l'ancien.
Que veux dire cette dernière ligne? C'est un genre de double boucle imbriquée?
fonctionnel, mais comme je l'ai dit, pour chaque référence dans "old", tu exécutes la commande vaf sur "new". ça va être très long. ça consomme beaucoup de ressources. tu vas avoir des faux positifs, parce que ce qui apparaît au début de "new" ne correspond pas à ce qui est en cours de lecture de "old"
quelle est la version de bash sur le serveur ? si il n'y a pas de listes, il n'y a pas non plus de Substitution de processus ( <() ).
bon, pas de Substitution de processus, on peut passer par des fichiers temporaires :
while IFS='|' read old new
do
oldRef=$(echo "$old" | cut -d ' ' -f1,2) # pour être lisible, mais en peu le faire totalement en bash
newRef=$(echo "$new" | cut -d ' ' -f1,2) # > avec quelques Remplacement de paramètres, c'est dans le man.
test "$oldRef" = "$newRef" || { ...
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Je ne sais pas comment voir la version du bash. Passer par des fichier temporaire est lent aussi non. Je ne comprend "faux positif" pourquoi? Car je pense que tu as complètement raison mon script ne détecte aucune différence
pour le faux positifs : ton script va comparer toute la sortie de vaf -v "$new" à chaque ligne de vaf -v "$old"
en fait tu ne devrais avoir quasiment que des erreurs, car par exemple, la première ligne de "old" peut correspondre à la première ligne de "new",
puis le script va continuer à lire "new", et la deuxième ligne ne correspondra pas à la première ligne de "old" toujours en cours, et vice-versa la première ligne re-re-re-relu ne pourra pas correspondre la première ligne de "old" qui n'est plus en cours.
pour les fichiers temporaires, il ne seront écrits puis lus qu'une seule fois au lieu d'exécuter autant de fois vaf -v "new" qu'il y a de lignes dans vaf -v "old". c'est beaucoup plus économique. le problème principale des fichiers temporaires c'est les lectures/écritures répétées, qui consomment des ressources et du temps.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
J'avais essayé mais ça marche pas c'est des serveurs unix par contre les script se lance quand même donc le bash dois être quelque par. J'ai pu remarquer que je n'ai pas besoin de mettre en haut !#bin/bash c'est la toute première fois que je vois ça mais ça marche je sais pas par quel mécanisme
Oui c'est vrais à la base je voulais tout mettre dans un tableau(ou liste) le problème c'est que je connais pas la taille de celui-ci et que le terminal me sors une erreur
J'aurais que des erreurs si je compare sur les différence mais c'est pas le cas je compare sur le nom du fichier si c'est le même et puis je vérifie si c'est le cas je vérifie le numéro de versionning. Ton script fonctionne que si les fichier sont à la même place non? Car vu que l'on peut rajouter des .c et des .h .dt etc il se peut que par la suite les fichier ne soit pas à la même place.
Donc il est exécuter en sh. Le serveur n'as pas de bash. Donc c'est du shell sh. Je vois du shl mais je connais pas. Je voudrais installer du bash mais cela me semble un peu chaud à faire.
Ok comment faire pour créer une liste dynamique? Car je ne sais pas combien d'élement sont dans mon fichiers en .sh
ça n'empêche pas de mettre un shebang correspondant au type de shell utilisé (ici /bin/sh), ainsi on saura immédiatement qu'il n'y aura pas de "bashismes", et les formes "archaïques" du script choqueront moins.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Awk et bash
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique