IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Filtrer un fichier avec grep


Sujet :

Shell et commandes GNU

  1. #41
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Chez moi, sur une redhat, c'est exclusivement une built-in ou un alias de whence -v (que je ne connaissais pas d'ailleurs )...
    Donc encore une commande qui n'existe pas de base sous au moins certains linux (???)
    C'est une commande standard Unix mais qui, par conception, ne peut être implémentée que par le shell, elle n'aurait pas de sens autrement.

    Tous les shells (en dehors de csh, tcsh et busybox) doivent implémenter "type", directement ou via un alias.

    C'est le cas au moins de sh (le vrai Bourne shell), bash, ash, dash, zsh, ksh88, ksh93, pdksh et même fish.

    "whence" est une commande à ma connaissance spécifique à ksh.

  2. #42
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Voici un explicatif du script awk, mais regarde la proposition de Jack-ft, celle-ci à le mérite de montrer tout de suite comment sont apairés tes fichiers sans avoir besoin de regarder dedans.
    Merci pour ces explications dans l'ensemble c'est plus clair pour moi.


    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FNR == 1 {
      next
    }
    #La variable FNR contient le numero de ligne du fichier en cours de lecture.
    #Ici, on passe à l'itération suivante (donc la ligne suivante), si FNR = 1.
    OK

    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /^CELL/ {
      if(exist C[$0]){
        E[$0]=++F
      }
      else{
        C[$0]=++D
      }
    }
    #Si on rencontre le pattern '^CELL' (donc ligne qui commence par CELL) alors:
    #S'il existe déjà une association de la ligne dans le tableau C, cela veut dire que l'on a déjà rencontré la ligne CELL...., 
    #et donc que l'on est en train de lire le deuxieme fichier et comme celui-ci n'a pas obligatoirement le même index, on le stocke dans E.
    #Sinon, c'est que l'on est dans le premier fichier, et donc on stocke l'index dans C.
    #PS: Au lieu de généré un index spécifique au deuxieme fichier (E[$0]=++F), on pourrait directement récupérer l'index que l'on a généré pour le premier fichier (F=C[$0]), comme ceci, le fichier fichier1.txt aurait comme correspondant fichier_db1.txt, etc...
    OK

    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    F {
      print >> "fichier_db" F ".txt"
      next
    }
    #Là, on passe par un racourci: si F est défini et différent de 0, alors c'est que l'on est dans le deuxieme fichier, donc on ecrit dans le fichier avec une #racine au deuxieme fichier et d'index F (c'est le même principe que ton deuxième awk en fait).
    #puis on passe à l'itération suivante (donc la ligne suivante).
    La avec ton commentaire je vois a peu près ce que ca fait puisque tu dis que cela équivaut au deuxième awk de mon script par contre je ne comprends pas bien le mécanisme F s'incrémente a partir du moment ou on croise le pattern CELL et que la ligne a déja été indexée (elle existe déjà), Mais F contient quoi concrètement j'ai du mal a comprendre comment on rempli les sous fichiers? C'est comme une adresse ?
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
      print >> "fichier" D ".txt"
    }
    #ici, c'est l'écriture lié au premier fichier. on passe ici que si les condition FNR == 1 et que F existe et différent de zéro sont fausses.
    Idem je ne comprends pas bien le mécanisme...

    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    END{
      for (i in C){
        print "fichier" C[i] ".txt fichier_db" E[i] ".txt"
      }
    }
    #Ce bloque n'est executé que quand tous les fichiers en entrée ont été traités:
    #'C' est un tableau et i prendra à chaque tour, l'index suivant du tableau associatif C qui n'est pas un nombre mais l'une des ligne CELL...


    Les arguments en entrés ($1 et $2) sont traités l'un après l'autre ? une fois traités on effectue la boucle for ok. Je vois qu'il y a une une relation avec les tableaux C[$0] et E[$0] mais c'est assez compliqué pour moi pour le lien entre i, le tableau associatif C et les deux tableaux C et E...

    Sinon dernier point, si la ligne qui contient le pattern CELL diffère quelques peu entre le fichier My.TXT et Mysecond.TXT il y a une différence d'indexage de ce que je comprend et du coup la commande ne fonctionne plus, mais cela tu l'avais déjà indiqué...

    -----------My.TXT----------

    CELL giga_2(3)
    toto a.1
    toto a.2
    toto a.3
    CELL misc_3(5)
    toto b.1
    toto b.2
    toto c.4
    toto e.8
    toto j.1
    CELL alpha_1(3)
    toto a.1
    toto a.2
    toto a.3
    ---------------------------

    -----------Mysecond.TXT----------

    CELL alpha_1(3)
    toto a.1
    toto a.2
    toto a.3
    CELL giga_2(3)
    toto a.1
    toto a.2
    toto a.3
    CELL misc_3(6)
    toto b.1
    toto b.2
    toto c.4
    toto e.8
    toto j.1
    toto b.2
    ---------------------------

    Nb: Demain j'essaye la méthode proposé par Jack-ft encore merci pour votre aide.

  3. #43
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    C'était bien ce qu'il me semblait avoir compris: l'ordre des différents "éléments" ("CELL alpha 1", "CELL giga_2", "CELL misc_3"...) n'est pas forcément le même dans les 2 fichiers conteneurs "My.TXT" et "Mysecond.TXT" et n'a pas vraiment d'importance. N'est-ce pas?

    Du coup, ne serait-ce pas plus logique de nommer les fichiers intermédiaires en fonction de ce qu'on trouve dans la ligne "CELL".
    Ainsi l'analyse de "My.TXT" séparerait les données des différents CELL en produisant, dans cet ordre, 3 fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "fichier-alpha-1.txt" "fichier-giga-2.txt" "fichier-misc-3.txt",
    tandis que l'analyse de "Mysecond.TXT" produirait, dans cet ordre, les fichiers:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "fichier-db-giga-2.txt" "fichier-db-misc-3.txt" "fichier-db-alpha-1.txt"
    L'analyse de comparaison reviendrait alors à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    diff fichier-alpha-1.txt fichier-db-alpha-1.txt
    diff fichier-giga-2.txt fichier-db-giga-2.txt
    diff fichier-misc-3.txt fichier-db-misc-3.txt
    ce qui peut aisément être réalisé avec une boucle (sans s'occuper de l'ordre de création) et une petite manipulation de nom de fichier, comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for dbfile in *-db-*.txt; do
      file=${dbfile/-db/}  # si ton shell le supporte
      file=$(echo "$dbfile" | sed -e 's/-db//') # si ton shell ne supporte pas la ligne précédente
      echo "======== Voici les différences entre '$file' et '$dbfile' ========"
      diff "$file" "$dbfile"
    end
    Avec "awk", j'imagine que certains experts pourront même faire tout ça en ram (lecture des 2 fichiers conteneurs et sans passer par les fichiers intermédiaires "fichier*.txt")...
    Avis aux amateurs...
    Bonjour,

    j'ai un petit soucis de compréhension avec ce terme ==> *-db-*.txt cela correspond aux fichiers _db présent dans mon répertoire courant ?

  4. #44
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par julien terrier Voir le message
    j'ai un petit soucis de compréhension avec ce terme ==> *-db-*.txt cela correspond aux fichiers _db présent dans mon répertoire courant ?
    Dans ton post explicatif (https://www.developpez.net/forums/d1...p/#post8939213), tu indiques:
    L'objectif pour moi étant de faire la mm commande entre le fichier My.TXT et Mysecond.TXT bien entendu en modifiant la nomination des fichiers par fichier_db par exemple fichier_db1.txt, fichier_db2.txt etc...
    On est bien d'accord que les fichiers dont une partie du nom contient "db" ne sont pas présents dans le répertoire avant l'exécution de la commande, mais bien produits par la commande?

    Dans ta version, les fichiers "*_db*.txt" sont les fichiers fichier_db1.txt, fichier_db2.txt etc

    Dans ma proposition, je propose de donner des noms plus significatifs, car chaque fichier décrit une CELL:

    tandis que l'analyse de "Mysecond.TXT" produirait, dans cet ordre, les fichiers "fichier-db-giga-2.txt" "fichier-db-misc-3.txt" "fichier-db-alpha-1.txt"
    Dans ma proposition, les fichiers *-db-*.txt sont "fichier-db-alpha-1.txt" "fichier-db-giga-2.txt" "fichier-db-misc-3.txt" etc.

    Remarque: c'est toi qui as proposé de mettre "db" dans leur nom (car j'imagine que cela a du sens pour toi).
    Par souci de cohérence, compte-tenu que tu nommes les fichiers source "My.TXT" et "Mysecond.TXT", j'aurais plutôt appelé "*-second-*.txt" le second jeu de fichiers CELL...

  5. #45
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    On est bien d'accord que les fichiers dont une partie du nom contient "db" ne sont pas présents dans le répertoire avant l'exécution de la commande, mais bien produits par la commande? ==> right
    Merci pour le retour

    Pour l'instant je n'ai pas encore réussi a associer le fichier avec un nom significatif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    awk '/^CELL/ {c++} {print >> "fichier-" c ".txt"}' $1 
    awk '/^CELL/ {c++} {print >> "fichier-db-" c ".txt"}' $2
     
    for dbfile in *-db-*.txt; do
      file=${dbfile/-db/}  # si ton shell le supporte
      echo "======== Voici les différences entre '$file' et '$dbfile' ========"
      diff "$file" "$dbfile"
    done
    Avec ce script il fait un diff selon l'index. Soit diff fichier-1 fichier-db-1 ce qui est normal puisque je supprime "-db" pour retrouver le fichier intermédiaire issue de My.TXT

    Je continue...

  6. #46
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 424
    Par défaut
    Que cela soit la méthode de jack-ft ou celle que j'ai proposé sous awk, il me semble que tu as oublié de nous dire:
    Comment faire pour reconnaitre le fichier issue de My.TXT qui correspond à celui issue de Mysecond.TXT si la première ligne n'est pas totalement identique:
    fichier1.txt
    fichier-db-1.txt
    Donc comment identifier un pattern qui correspondrait ?

  7. #47
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Pour être honnête je n'avais pas remarqué cette contrainte ; pour moi les premières lignes étaient identiques. Je m'en suis aperçu après avoir testé les commandes proposez.

    Mais je me rends compte que j'ai trop de lacunes et je mets pas mal de temps car en même temps j'essaye de m'instruire http://www.grymoire.com/Unix/Awk.html#uh-0 et bourne shell...

    Du coup j'en profite : pourquoi tu ne mets pas BEGIN et END dans tes scripts AWK ?

  8. #48
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 424
    Par défaut
    Ici, j'ai pas besoin du BEGIN, car je n'ai pas besoin d'initialiser quoi que ce soit avant de commencer à parser les fichiers.

    Par contre, le END je l'utilise, car je ne peux faire l'apairage qu'une que j'ai fini de parser les fichiers.

    Et pour répondre aux autres questions: D et F au départ sont vide, et si on fait par exemple ++F, F sera égal à 1, ensuite à 2, etc...
    Pour la boucle for i (in C) , i contiendra un des index de C à chaque tour de boucle (ici, l'index n'est pas une valeur numérique, mais l'une des lignes CELL...
    Par contre la valeur contenu dans C[i] est la valeur de l'incrément de D au moment ou on l'a stocker, idem pour E[i] qui contient la valeur de l'incrément de F au moment du stockage.

  9. #49
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Bonjour,

    j'ai un peu avancé mais le résultat n'est tjrs pas convaincant, je bute sur le renommage...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/sh
     
    awk '/^CELL/ {c++} {print >> "fichier-" c ".txt"; My_file="fichier-" c ".txt";} {print $My_file} {if ( $0 ~ /^CELL/ ) {FS=" "; print >> $2".txt"; My_title=$2".txt"; print My_title}}' $1
    fichier entrant My.TXT:

    CELL giga_2 (3)
    toto a.1
    toto a.2
    toto a.3
    CELL misc_3 (5)
    toto a.1
    toto a.2
    toto a.3
    CELL alpha_1 (3)
    toto b.1
    toto b.2
    toto c.4
    toto e.8
    toto j.1

    Partie 1 ==> Je créer un fichier se nommant fichier-x.txt a chaque fois que je rencontre le pattern CELL, toutes les lignes n'ayant pas ce pattern sont ajoutées a ce mm fichier.
    Partie 2 ==> Si la ligne contient le pattern CELL on split la ligne en cours de lecture en colonne a chaque espace rencontré afin de créer x colonne ( autant qu'il y a d'espace) ensuite on redirige la ligne (entière) dans un fichier qui se nommera avec le nom de la colonne n°2.

    Ce que je voudrais faire maintenant c'est renommer le fichier-x.txt de la partie 1 avec le nom de fichier de la partie 2.

    J'ai essayer un mv dans le awk mais cela sermble ne pas etre pris en compte et si je sors du awk je perds les variables qui y sont associées
    Autre question que je me pose peut on renommer un fichier alors qu'il est en cours de lecture ?

    Je viens d'ajouter une redirection et un remove des fichier-x.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
     
    awk '/^CELL/ {c++} {print >> "fichier-" c ".txt"; My_file="fichier-" c ".txt";} {print $My_file} {if ( $0 ~ /^CELL/ ) {FS=" "; My_title=$2".txt"; print My_title} {print $My_file > My_title}}' $1
     
    rm -f fichier-*.txt
    Du coup j'obtiens des fichiers avec le nom que je souhaites, il me reste a faire la mm opérations pour le second fichiers source après je me pencherais sur le diff.

  10. #50
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Bon j'arrive a quelques choses de pas trop mal avec ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
     
    awk '/^CELL/ {c++} {print >> "fichier-" c ".txt"; My_file="fichier-" c ".txt";} {print $My_file} {if ( $0 ~ /^CELL/ ) {FS=" "; My_title=$2".txt"; print My_title} {print $My_file > My_title}}' $1
    awk '/^CELL/ {c++} {print >> "fichier-db-" c ".txt"; My_file="fichier-db-" c ".txt";} {print $My_file} {if ( $0 ~ /^CELL/ ) {FS=" "; My_title=$2"-db.txt"; print My_title} {print $My_file > My_title}}' $2
     
    rm -f fichier-*.txt
     
    for dbfile in *-db.txt; do
      file=${dbfile/-db/}  # si ton shell le supporte
      echo "======== Voici les différences entre '$file' et '$dbfile' ========"
      diff "$file" "$dbfile" >> essai.txt
    done
    Il me reste a mettre en forme le fichier essai.txt afin de comprendre rapidement ou se trouve les différences.

  11. #51
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Merci pour votre aide, j'ai conscience que c'était un peu lourd, vraiment merci pour votre disponibilité.

    Je mets en resolu.

  12. #52
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Bon, finalement, j'ai réussi à trouver un peu de temps pour tester (désolé d'arriver après la bataille) et voici ce que je propose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    !/bin/bash
     
    awk_script='
    BEGIN { fileName = "error.txt" }
    /^CELL/ { cellName = gensub(/CELL ([^(]+).*/, "\\1", "g", $0) # On extrait "giga_2" de "CELL giga_2(3)"
              fileName = prefix cellName ".txt" # On construit le nom du fichier
              next }
    { print $0 >> fileName } # On met toutes les lignes qui suivent dans le fichier
    '
    gawk -v prefix='fichier-' "${awk_script}" "$1"
    gawk -v prefix='fichier-db-' "${awk_script}" "$2"
     
    for dbfile in *db-*.txt; do
      file=${dbfile/db-/}
      echo "======== Voici les differences entre '$file' et '$dbfile' ========"
      diff "$file" "$dbfile"
    done
    Et on lance le script avec ./myscript.sh "My.txt" "Mysecond.txt" | less ou bien ./myscript.sh "My.txt" "Mysecond.txt" > result.txt par exemple.

    J'ai mis dans "My.txt":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CELL giga_2(3)
    toto a.1
    toto a.2
    toto a.3
    CELL misc_3(5)
    toto b.1
    toto b.2
    toto c.4
    toto e.8
    toto j.1
    CELL alpha_1(3)
    toto a.1
    toto a.2
    toto a.3

  13. #53
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Bonjour Jack,

    tout d'abord merci pour ton retour et ton aide.

    J'ai testé ton script et j'ai juste une seul remarque, dans le fichier result les diff sont mis en double.

    Dans tous les cas merci car sans ton aide je n'aurai pas eu le résultat escompté....

  14. #54
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par julien terrier Voir le message
    J'ai testé ton script et j'ai juste une seul remarque, dans le fichier result les diff sont mis en double.
    Hmm, bizarre, ce n'est pas ce que j'observe chez moi (avec un jeu d'essai rudimentaire).

    J'ai pensé aussi à autre chose: pour faciliter la comparaison, tu peux aussi utiliser un comparateur de répertoires, un rudimentaire comme "diff -r", un plus sympa comme "emacs > tools > compare > two directories", ou n'importe quel autre outil approprié.

    Pour cela, il suffit juste de modifier légèrement le script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/bin/bash
     
    if test $# -ne 2; then
        echo "$0: arg missing"
        echo "usage: $0 <file1> <file2>"
        exit 1
    fi 1>&2
     
    file1=$1
    file2=$2
     
    dir1=${file1%.txt}.dir
    dir2=${file2%.txt}.dir
     
    if test -e "${dir1}"; then rm -rf "${dir1}"; fi
    if test -e "${dir2}"; then rm -rf "${dir2}"; fi
     
    mkdir "${dir1}" || exit 1
    mkdir "${dir2}" || exit 1
     
    awk_script='
    BEGIN { fileName = "error.txt" }
    /^CELL/ { cellName = gensub(/CELL ([^(]+).*/, "\\1", "g", $0)
              fileName = dir "/" "fichier-" cellName ".txt"
              #print fileName
              next }
    { print $0 >> fileName }
    '
     
    gawk -v dir="${dir1}" "${awk_script}" "${file1}"
    gawk -v dir="${dir2}" "${awk_script}" "${file2}"
     
    diff -r "${dir1}" "${dir2}"

  15. #55
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Hmm, bizarre, ce n'est pas ce que j'observe chez moi (avec un jeu d'essai rudimentaire).
    Erratum je relancé le script et effectivement tout est correcte, je ne sais pas pourquoi la première fois cela a écrit en doublon...

    Merci pour cette autre méthode que je suis entrain d'étudier...

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 11
    Dernier message: 17/01/2010, 15h10
  2. Filtrer avec Grep
    Par sebys dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 14/04/2008, 16h31
  3. Recherche fichier avec grep
    Par Fluxy dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 21/12/2007, 13h25
  4. Filtrer fichiers avec FileDialog ?
    Par m@t dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 04/11/2005, 20h33
  5. Grep pour filtrer le fichier log
    Par devdev2003 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/02/2005, 06h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo