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. #21
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Merci pour vos retour, j'ai modifié mon précédent post pour qu'il soit plus compréhensible.
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  2. #22
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Pas tout compris du besoin, tu veux comparer la première ligne de chaque fichier issue de My.txt et MySecond.txt ?

    Si c'est le cas, c'est faisable directement depuis la phase awk, donc tiens-tu vraiment le faire en tcsh ?
    J'ai modifié mon précédent post j'espère que cela sera plus clair pour toi mais c'est a peu près l'idée sauf qu'il faut que je garde le contenu des fichiers crée par la première commande awk.

    Je vais passer en bash c'est l'occasion

    Merci.
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  3. #23
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonne question, car csh et tcsh ne sont pas gnu non plus

    Sur quel système (OS) travailles-tu ?

    J'aurai tendance à dire que si tu n'es pas sous linux mais sous un unix propriétaire et que tu utilises les commandes d'origines comme le awk par exemple, vaut mieux que tu restes sur ce forum.
    Si tu utilises des commandes de package gnu comme gnu awk par exemple, oui, tu peux aller vers l'autre forum.

    Mais, pourquoi rester sur csh ou tcsh, tu es sur un historique trop lourd pour pouvoir au moins commencer à changer ?

    Et sinon, toujours pas vu de réponses aux questions précédemment posées...
    Oui je suis sous unix, mais qu'appelle tu propriétaire ? Ca va faire 1 an que j'ai decouvert unix/linux ( mieux vaut tard que jamais ), a l'issue d'un chgt de poste du coup je suis un peu novice ds le domaine...

    Je n'ai pas la main sur l'installation des packages ou autres, je ne suis pas root et je suis incapable de répondre a ta question a savoir est-ce que j'utilise des commandes issue du package gnu. Obscurantisme...

    Pour la dernière question il y a beaucoup de scripts écrient en tcsh ou en perl dans mon service. J'ai vu que certains scripts écrient en tcsh sont appelés depuis les scripts perl donc qui cohabitent et lisant le post de jack-ft apparemment on peut merger des scripts tcsh/csh avec du bash ou ksh.

    Pour conclure je vais l'écrire en bash il est temps de faire la bascule ( au départ je suis resté en tcsh par que j'ai quelques connaissance en C du coup ej me suis dis que cela serait plus facile a appréhender ).
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  4. #24
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Bonjour Julien, je "crois" avoir plus ou moins compris ce que tu veux, mais ajouter un peu de clarté ne serait pas du luxe!

    Je lance une première réponse concernant le système et le choix tcsh/bash... (la suite, plus tard)

    Peux-tu nous dire sur quel système/OS tu travailles ?

    Peux-tu aussi nous dire ce que répondent les commandes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    which tcsh
    which bash
    which csh
    which ksh
    Si ton système com/sup-porte un bourne shell (/bin/sh), voire un bash (/bin/bash par exemple), alors il est important de savoir qu'il est tout à fait possible de "mélanger" du tcsh existant avec du nouveau en bash, à condition de séparer les fichiers. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cat > test1.bash <<EOF
    #!/bin/bash
    level=\${1:-0}
    if test \$level -le 0
    then echo "Bash arrête"
    exit 0
    fi
    echo "ceci est exécuté par BASH (level=\$level) et appelle un script concurrent"
    ((level--))
    ./test1.tcsh \$level
    EOF
    chmod +x test1.bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cat > test1.tcsh <<EOF
    #!/bin/tcsh
    @ level = \$1
    if ( \$level <= 0 ) then
        echo "Tcsh arrête"
        exit 0
    endif
    echo "ceci est exécuté par TCSH (level=\$level) et appelle un script concurrent"
    @ level--
    ./test1.bash \$level
    EOF
    chmod +x test1.tcsh
    Et ça marche!

    Sur mon mac, il me dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ ./test1.tcsh 5
    ceci est exécuté par TCSH (level=5) et appelle un script concurrent
    ceci est exécuté par BASH (level=4) et appelle un script concurrent
    ceci est exécuté par TCSH (level=3) et appelle un script concurrent
    ceci est exécuté par BASH (level=2) et appelle un script concurrent
    ceci est exécuté par TCSH (level=1) et appelle un script concurrent
    Bash arrête
     
    uname -a
    Darwin MBPR15-jack 15.6.0 Darwin Kernel Version 15.6.0: Mon Jan  9 23:07:29 PST 2017; root:xnu-3248.60.11.2.1~1/RELEASE_X86_64 x86_64
    De cette manière, tu peux choisir de commencer à écrire des morceaux en bash (ou sh) et les appeler depuis l'existant (en tcsh). (et réciproquement, si besoin!)

    Et tu auras probablement plus de soutien en bash qu'en tcsh! (paix à son âme! )
    Merci jack-ft pour ton aide.

    Pour info j'ai mis a jour mon précédent post en esperant que mon problème soit plus compréhensible...

    J'ai bien pris note des commandes a tester dans mon terminal. J'essayerai lundi afin de voir ce que cela donne.

    Merci pour cette astuce je garde précieusement l'info car tôt ou tard je ne vais pas y échapper... Enfin ca risque surtout de me faciliter la vie au lieu de réécrire la roue .
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  5. #25
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Voici un exemple en awk qui crée les fichiers pour les 2 fichiers et te dis quel fichier est apairé avec l'autre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ls
    Mysecond.TXT  My.TXT
    $ awk '/^CELL/ {if(exist C[$0]){E[$0]=++F}else{C[$0]=++D}} F {print >> "fichier_db" F ".txt";next} {print >> "fichier" D ".txt"}END{for (i in C){print "fichier" C[i] ".txt fichier_db" E[i] ".txt"}}' My.TXT Mysecond.TXT 
    fichier3.txt fichier_db2.txt
    fichier1.txt fichier_db3.txt
    fichier2.txt fichier_db1.txt
    $ ls
    fichier1.txt  fichier2.txt  fichier3.txt  fichier_db1.txt  fichier_db2.txt  fichier_db3.txt  Mysecond.TXT  My.TXT
    ATTENTION: ici je considère que tes 2 fichiers vont créer le même nombre de fichiers et que chaque fichier venant de My.TXT à un fichier venant de Mysecond.TXT qui lui correspond.
    Cordialement.

  6. #26
    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
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par julien terrier Voir le message
    Oui je suis sous unix, mais qu'appelle tu propriétaire ?
    Unix est un standard, toutes les implémentations de ce standard ont leur propre nom. Certaines sont open source, d'autres ne le sont pas. Ce sont ces dernières que l'on dit propriétaires.

    Ca va faire 1 an que j'ai decouvert unix/linux ( mieux vaut tard que jamais ), a l'issue d'un chgt de poste du coup je suis un peu novice ds le domaine...
    Essaie les commandes suivantes, ça nous donnera une idée du système sur lequel tu travailles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    uname -a
    cat /etc/*release
    type awk nawk gawk
    awk --version
    au départ je suis resté en tcsh par que j'ai quelques connaissance en C du coup ej me suis dis que cela serait plus facile a appréhender
    C'est une grosse blague qui dure depuis bientôt 40 ans, la syntaxe de csh n'a à peu près rien de commun avec le langage C.
    ɹǝsn *sıɹɐlos*

  7. #27
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par julien terrier Voir le message
    Du coup fichier1.txt == fichier_db3.txt - fichier2.txt == fichier_db1.txt et fichier3.txt == fichier_db2.txt
    Ce dont je suis certains c'est que la première ligne des fichiers est identique dans les deux fichiers exemple fichier1.txt ==> CELL alpha_1 et fichier_db3.txt: ==> CELL alpha_1 le reste peut changer toto a.1 dans le fichier1.txt peut devenir tata b.2 dans le fichier_db3.txt

    Donc je souhaite récupérer la première ligne des fichiers crée par le awk
    Faire une double boucle for ou foreach comparer les chaines de caractère afin d’appairer les fichiers entre eux.
    Une fois que les fichiers sont appairés je souhaites faire un diff ou tkdiff pour voir ce qui a changé exemple si toto a.1 est devenu tata b.2 ou si une ligne s'est ajoutée.
    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...

  8. #28
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Bonjour Julien, je "crois" avoir plus ou moins compris ce que tu veux, mais ajouter un peu de clarté ne serait pas du luxe!

    Je lance une première réponse concernant le système et le choix tcsh/bash... (la suite, plus tard)

    Peux-tu nous dire sur quel système/OS tu travailles ?

    Peux-tu aussi nous dire ce que répondent les commandes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    which tcsh
    which bash
    which csh
    which ksh
    Bonjour pour reprendre dans l'ordre chronologique des messages:

    Système/OS ==> "Red Hat Enterprise Linux Server release 6.7 (Santiago)"

    which tcsh ==> /bin/tcsh
    which bash ==> /bin/bash
    which csh ==> /bin/csh
    which Ksh ==> /bin/ksh
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  9. #29
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par jlliagre Voir le message

    Essaie les commandes suivantes, ça nous donnera une idée du système sur lequel tu travailles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    uname -a
    cat /etc/*release
    type awk nawk gawk
    awk --version
    uname -a ==> Linux gnbsx50340 2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:37 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux
    cat /etc/*release ==> Red Hat Enterprise Linux Server release 6.7 (Santiago)
    type awk nawk gawk ==> type: Command not found.
    awk --version ==> GNU Awk 3.1.7
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  10. #30
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Au lieu de type qui est une built-in bash, il aurait fallu utiliser which, mais c'est pas grave, on a assez d'informations pour dire que cette discussion aurait plus sa place dans le forum "shell et commandes gnu" (voir si un admin veut bien la déplacer...)
    Cordialement.

  11. #31
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Au lieu de type qui est une built-in bash, il aurait fallu utiliser which, mais c'est pas grave, on a assez d'informations pour dire que cette discussion aurait plus sa place dans le forum "shell et commandes gnu" (voir si un admin veut bien la déplacer...)
    Ok merci.

    /usr/bin/awk
    nawk: Command not found.
    /usr/bin/gawk

    Il est clair que je dois me renseigner sur les différences majeur entre commandes POSIX et commandes GNU
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  12. #32
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Voici un exemple en awk qui crée les fichiers pour les 2 fichiers et te dis quel fichier est apairé avec l'autre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ls
    Mysecond.TXT  My.TXT
    $ awk '/^CELL/ {if(exist C[$0]){E[$0]=++F}else{C[$0]=++D}} F {print >> "fichier_db" F ".txt";next} {print >> "fichier" D ".txt"}END{for (i in C){print "fichier" C[i] ".txt fichier_db" E[i] ".txt"}}' My.TXT Mysecond.TXT 
    fichier3.txt fichier_db2.txt
    fichier1.txt fichier_db3.txt
    fichier2.txt fichier_db1.txt
    $ ls
    fichier1.txt  fichier2.txt  fichier3.txt  fichier_db1.txt  fichier_db2.txt  fichier_db3.txt  Mysecond.TXT  My.TXT
    ATTENTION: ici je considère que tes 2 fichiers vont créer le même nombre de fichiers et que chaque fichier venant de My.TXT à un fichier venant de Mysecond.TXT qui lui correspond.
    J'ai testé la commande, j'ai quasiment le mm comportement sauf j'ai un fichier en plus et le fichier3.txt qui intègre le début du fichier source Mysecond.txt



    fichier.txt:
    -----------My.TXT----------



    fichier3.txt:
    CELL misc_3
    toto b.1
    toto b.2
    toto c.4
    toto e.8
    toto j.1
    ---------------------------
    -----------Mysecond.TXT----------

    Pour le coup j'essaye de comprendre précisement ce que fait la commande awk.

    Merci pour ton aide
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  13. #33
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 722
    Points
    12 722
    Par défaut
    J'avais pas compris que les lignes du genre '------My.TXT-----' était réellement dans tes fichiers...

    Et donc, dans ce cas, comment peuvent fonctionner les 2 awk que tu utilises déjà ?
    Cordialement.

  14. #34
    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
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Au lieu de type qui est une built-in bash, il aurait fallu utiliser which
    "which" avait déjà été demandé, j'ai ajouté "type" qui est une commande standard POSIX, pas seulement bash. Quand elle est exécutée par un shell de type Bourne, elle peut donner des informations utiles sur la façon dont le shell interprète la commande passée en argument, ce que which ne peut pas faire. Si elle retourne "type not found", on obtient aussi une information intéressante.
    ɹǝsn *sıɹɐlos*

  15. #35
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    J'avais pas compris que les lignes du genre '------My.TXT-----' était réellement dans tes fichiers...

    Et donc, dans ce cas, comment peuvent fonctionner les 2 awk que tu utilises déjà ?
    erratum cela fonctionne correctement, effectivement a aucun moment j'ai mentionné qu'il y avait ces lignes en plus.

    Par contre ce sont des fichiers exemples que j'ai mentionné les fichiers que je souhaites traités sont un peu différent mais comme je ne voulais pas ajouter de la complexité lors de l'explication de mon pb.

    Les fichiers que je souhaites traités commence toujours par:

    --- RULECHECK RESULTS STATISTICS (BY CELL)
    ---
    Du coup j'ai un fichier.txt avec cette phrase ==> --- RULECHECK RESULTS STATISTICS (BY CELL) et pas de fichier_db.txt car cette phrase est inclu dans le dernier fichierxx.TXT

    Ce que je pense comprendre:

    ==> dès que l'on rencontre cette chaine de caractère ou si la ligne commence par cette chaine de caractère ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {if(exist C[$0]){E[$0]=++F}else{C[$0]=++D}}
    ==> Si C[$0] (CELL ?) exist on incrémente F sinon on incrémente D ( pas sur d'avoir compris) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F {print >> "fichier_db" F ".txt";next}
    ==> Je pense qu'il y a une redirection du contenu mais je ne comprends pas bien le mecanisme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {print >> "fichier" D ".txt"}END
    ==> idem

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {for (i in C){print "fichier" C[i] ".txt fichier_db" E[i] ".txt"}}'
    je connais le principe de la boucle for par contre la j'ai du mal pour tout faire recoupé. Je devine que i vaudra successivement 0,1,2 etc ( depend du nbre précédent d'incrémentation) in = i Max? et pour C je ne sais pas ( d'habitude ca incrémente ou ce décrémente ) puis on affiche les deux fichiers si ils ont la même entête.

    Svp ayez de l'indulgence fasse a mon faible niveau
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  16. #36
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Si la ligne que tu parles est toujours la première de tes fichiers, tu devrais pouvoir résoudre le problème en disant à awk de passer à la suivante si c'est la première ligne du fichier, cela donnerait donc la modification suivante (en rouge) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ awk 'FNR == 1 {next} /^CELL/ {if(exist C[$0]){E[$0]=++F}else{C[$0]=++D}} F {print >> "fichier_db" F ".txt";next} {print >> "fichier" D ".txt"}END{for (i in C){print "fichier" C[i] ".txt fichier_db" E[i] ".txt"}}' My.TXT Mysecond.TXT
    Sinon, pour mieux comprendre comment fonctionne le script awk, revoici (juste le code awk) en indenté:
    Code awk : 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
    FNR == 1 {
      next
    }
    /^CELL/ {
      if(exist C[$0]){
        E[$0]=++F
      }
      else{
        C[$0]=++D
      }
    }
    F {
      print >> "fichier_db" F ".txt"
      next
    } 
    {
      print >> "fichier" D ".txt"
    }
    END{
      for (i in C){
        print "fichier" C[i] ".txt fichier_db" E[i] ".txt"
      }
    }
    Cordialement.

  17. #37
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Julien, que penses-tu de ma proposition précédente (nommer les fichiers de CELL)?

  18. #38
    Membre actif
    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
    Points : 292
    Points
    292
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Julien, que penses-tu de ma proposition précédente (nommer les fichiers de CELL)?
    Bonjour Jack, je souhaites exploiter toutes les pistes je vais également essayer ta méthode mais comme je ne comprends pas tout je suis assez lent
    L’art est une activité humaine, le produit de cette activité ou l'idée que l'on s'en fait s'adressant délibérément aux sens, aux émotions, aux intuitions et à l'intellect. www.elise-galerie.com

  19. #39
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    "which" avait déjà été demandé, j'ai ajouté "type" qui est une commande standard POSIX, pas seulement bash. Quand elle est exécutée par un shell de type Bourne, elle peut donner des informations utiles sur la façon dont le shell interprète la commande passée en argument, ce que which ne peut pas faire. Si elle retourne "type not found", on obtient aussi une information intéressante.
    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 (???)
    Cordialement.

  20. #40
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 722
    Points
    12 722
    Par défaut
    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.

    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
    34
    35
    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.
    /^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...
    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).
    {
      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.  
    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...
    Cordialement.

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

Discussions similaires

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

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