Comparer fichier

myspace302 -  
 myspace302 -
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

3 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
    1. myspace302
       
      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
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
    3. myspace302
       
      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
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      #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
    5. myspace302
       
      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
  2. myspace302
     
    Franchement Merci je vais faire le test
    0
  3. myspace302
     
    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