A voir également:
- Comparer fichier
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Ouvrir fichier .bin - Guide
- Fichier host - Guide
3 réponses
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 419
14 mai 2012 à 14:48
14 mai 2012 à 14:48
Salut,
;-))
$ cat fich A01 Il est malade B02 Toto est de retour C01 Titi joue au foot A01 Toto reviens ce soir B01 Eric code en "JAVA" C02 Marine est revenue A01 Toto est devenu sage B02 titi regarde la télé C01 Il est étudiant $ sed -n '/A01/{:z;N;/\n$/! bz;/JAVA/p}' fich A01 Toto reviens ce soir B01 Eric code en "JAVA" C02 Marine est revenue $
;-))
Voici mon code shell, je me suis basé un sur ce que vous m'aviez montré hier
fichier_ref='grep -l $p_FULL_SIN_SEQ_REF /applications/FOBO/CATDEV4/DATA/reference/INF91/ready/PG/*' >> $p_fichier_ref
fichier_new='grep -l $p_FULL_SIN_SEQ $d_EDIT_READYDIR/*PG*'
fichier_ref='grep -l $p_FULL_SIN_SEQ_REF /applications/FOBO/CATDEV4/DATA/reference/INF91/ready/PG/*' >> $c_fichier_ref
fichier_new='grep -l $p_FULL_SIN_SEQ $d_EDIT_READYDIR/*PG*'
BG_ExecuterCommandeShell sed "/^B01/s/....\/..\/../____\/__\/__/g" $p_fichier_ref >> $c_fichier_ref
BG_ExecuterCommandeShell sed "/^B01/s/....\/..\/../____\/__\/__/g" $p_fichier_new >> $c_fichier_new
BG_ExecuterCommandeShell sed "/^D01/s/....\/..\/../____\/__\/__/g" $p_fichier_ref >> $c_fichier_ref
BG_ExecuterCommandeShell sed "/^D01/s/....\/..\/../____\/__\/__/g" $p_fichier_new >> $c_fichier_new
while read line
do
BG_ExecuterCommandeShell sed -n '/A01/{:z;N;$by /\nA01/ !bz /FULL_SIN_SEQ_REF/ {h;s/.*\n// x;s/\(.*\)\n.*/\1/p;g;G;D} s/.*\n/\n/ D:y/FULL_SIN_SEQ_REF/p}' $c_fichier_ref
BG_ExecuterCommandeShell sed -n '/A01/{:z;N;$by /\nA01/ !bz /FULL_SIN_SEQ/ {h;s/.*\n// x;s/\(.*\)\n.*/\1/p;g;G;D} s/.*\n/\n/ D:y/FULL_SIN_SEQ/p}' $c_fichier_new
BG_ExecuterCommandeShell sed "/^B01/s/FULL_SIN_SEQ_REF/FULL_SIN_SEQ/ " $c_fichier_ref
BG_ExecuterCommandeShell diff $c_fichier_ref $c_fichier_new
done
Alors dans ce shell je crée d'abords mes deux fichiers dans mes répertoires de travail.
Le but est de comparer deux fichiers sans tenir compte des dates et du numéro de facture (qui est le full_sin_seq pour le 1er fichier et le full_sin_seq_ref pour le second).
Dans mon sed je remplace toutes les dates des lignes B01 et D01 par le caractère ____/__/__
Ensuite je crée une boucle pour parcourir tous les deux fichiers et récupérer le bloc contenant le numéro de facture (c'est à dire le full_sin_seq)
Aprés l'avoir récupérer je remplace le numéro de facture ( full_sin_seq) par full_sin_seq_ref
Et pour terminer je fais un diff pour comparer les deux blocs
Je suis vraiment débutant en programmation shell je compte sur votre aide et j'attends vos proposition :)
fichier_ref='grep -l $p_FULL_SIN_SEQ_REF /applications/FOBO/CATDEV4/DATA/reference/INF91/ready/PG/*' >> $p_fichier_ref
fichier_new='grep -l $p_FULL_SIN_SEQ $d_EDIT_READYDIR/*PG*'
fichier_ref='grep -l $p_FULL_SIN_SEQ_REF /applications/FOBO/CATDEV4/DATA/reference/INF91/ready/PG/*' >> $c_fichier_ref
fichier_new='grep -l $p_FULL_SIN_SEQ $d_EDIT_READYDIR/*PG*'
BG_ExecuterCommandeShell sed "/^B01/s/....\/..\/../____\/__\/__/g" $p_fichier_ref >> $c_fichier_ref
BG_ExecuterCommandeShell sed "/^B01/s/....\/..\/../____\/__\/__/g" $p_fichier_new >> $c_fichier_new
BG_ExecuterCommandeShell sed "/^D01/s/....\/..\/../____\/__\/__/g" $p_fichier_ref >> $c_fichier_ref
BG_ExecuterCommandeShell sed "/^D01/s/....\/..\/../____\/__\/__/g" $p_fichier_new >> $c_fichier_new
while read line
do
BG_ExecuterCommandeShell sed -n '/A01/{:z;N;$by /\nA01/ !bz /FULL_SIN_SEQ_REF/ {h;s/.*\n// x;s/\(.*\)\n.*/\1/p;g;G;D} s/.*\n/\n/ D:y/FULL_SIN_SEQ_REF/p}' $c_fichier_ref
BG_ExecuterCommandeShell sed -n '/A01/{:z;N;$by /\nA01/ !bz /FULL_SIN_SEQ/ {h;s/.*\n// x;s/\(.*\)\n.*/\1/p;g;G;D} s/.*\n/\n/ D:y/FULL_SIN_SEQ/p}' $c_fichier_new
BG_ExecuterCommandeShell sed "/^B01/s/FULL_SIN_SEQ_REF/FULL_SIN_SEQ/ " $c_fichier_ref
BG_ExecuterCommandeShell diff $c_fichier_ref $c_fichier_new
done
Alors dans ce shell je crée d'abords mes deux fichiers dans mes répertoires de travail.
Le but est de comparer deux fichiers sans tenir compte des dates et du numéro de facture (qui est le full_sin_seq pour le 1er fichier et le full_sin_seq_ref pour le second).
Dans mon sed je remplace toutes les dates des lignes B01 et D01 par le caractère ____/__/__
Ensuite je crée une boucle pour parcourir tous les deux fichiers et récupérer le bloc contenant le numéro de facture (c'est à dire le full_sin_seq)
Aprés l'avoir récupérer je remplace le numéro de facture ( full_sin_seq) par full_sin_seq_ref
Et pour terminer je fais un diff pour comparer les deux blocs
Je suis vraiment débutant en programmation shell je compte sur votre aide et j'attends vos proposition :)
14 mai 2012 à 15:05
J'ai testé avec ta commande et voici le resultat
Label too long: /D01/{:z;N;/\n$/! bz;/1144/p}
En fait je ne comprend pas l'erreur
14 mai 2012 à 15:50
Quelle version de "sed" ?
Sinon en attendant, essaie avec un fichier de script comme suit :
14 mai 2012 à 15:55
Je crois que ta premiere méthode marche bien c'est juste mon test qui foire
Sinon j'aimerai bien comprendre ton instruction sed -n '/A01/{:z;N;/\n$/! bz;/JAVA/p}' fich
Je ne voit où tu definie le point d'arrêt du bloc (c'est à dire la derniere ligne qui commence par C01)
14 mai 2012 à 16:25
Affichage sur demande (avec le flag "p" voir plus loin)
/A01/ {
Quand on rencontre le motif, on applique les commandes définies entre les accolades.
:z
On définit une étiquette de branchement
N
On ajoute la ligne suivante dans l'espace de travail
/\n$/ !b z
Si on ne rencontre pas ( le "!" définit la négation) un caractère saut de ligne "\n" (le fait d'ajouter une ligne avec la commande "N", ajoute obligatoirement ce caractère entre les lignes), suivi du caractère fin de ligne "$", alors on se branche à l'étiquette et on recommence les commandes qui la suivent.
/JAVA/ p
Si on rencontre le motif, on imprime le tout sur la sortie standard avec la commande "p"
}
Fin du regroupement de commandes
Je ne voit où tu definie le point d'arrêt du bloc (c'est à dire la derniere ligne qui commence par C01)
En fait j'ai choisi la ligne vide comme motif (/\n$/) et pour être plus exacte, un saute de ligne (\n) suivi d'une fin de ligne ($).
Une ligne vide se définissant plus exactement avec "/^$/".
14 mai 2012 à 16:35
Par contre je voudrais juste savoir si c'est applicable dans le cas où l'on a des blocs avec des nombres de lignes variable:
Par exemple 14 lignes sur le bloc 1
20 sur le bloc 2 et 6 lignes sur le bloc 3
sachant que chaque ligne commence toujours par A01 (ce qui nous permet de délimiter les bloc)