Comparer fichier

Fermé
myspace302 - 14 mai 2012 à 14:41
 myspace302 - 15 mai 2012 à 20:41
Bonjour
Dans mon code shell, je dois créer une boucle où je dois recuperer un bloc de donnée specifique d'un fichier
Dans le fichier il ya plusieurs bloc, et je veux recuperer le bloc contenant une chaine de caractere specifique.

Par exemple:


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

Mon but est de parcourir tout le fichier et sélectionner le bloc contenant la lettre "JAVA", sachant que la 1ere ligne de chaque bloc commence par A1 et la dernière ligne se termine par C01

Je compte sur vous
A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 412
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


$

;-))
0
Merci
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
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 412
14 mai 2012 à 15:50
Quel système ?
Quelle version de "sed" ?

Sinon en attendant, essaie avec un fichier de script comme suit :

$ cat script.sed 
#n
/A01/ {                                
    :z                                 
    N                                  
    /\n$/ !b z                         
    /JAVA/ p                           
}

$ sed -f script.sed fich 
A01 Toto reviens ce soir
B01 Eric code en "JAVA"
C02 Marine est revenue

0
Je l'ai lancé sur Putty.
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)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 412
14 mai 2012 à 16:25
#n
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 "/^$/".
0
Merci je comprend beaucoup mieux
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)
0
Franchement Merci je vais faire le test
0
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 :)
0