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 :

AWK table hashage et comparaison entre deux fichiers


Sujet :

Shell et commandes GNU

  1. #21
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Shyma Voir le message
    Concernant ta remarque pour sed et grep, comment les intégrer dans awk ? -----je n'ai pas compris !!
    On ne peut pas intégrer sed et grep dans awk. Mais on peut programmer, dans le langage "awk", leur comportement.

    En fait awk est un langage complet. Il permet d'appliquer des traitements lourds (à base de tests et/ou d'itérations) sur un ou plusieurs fichiers. Perso je ne le recommande pas pour des trucs basiques (il est lourd à mettre en oeuvre donc si on peut utiliser d'autres trucs à sa place autant le faire) mais si on doit l'utiliser, alors on peut tout lui faire faire et se passer des autres outils. Mais faut le programmer...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #22
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Citation Envoyé par Shyma Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cat Fichier2 |grep -v '#'| sed 's/;/\t/g'\| awk -F\| 'FNR == NR {A[$2]=$1 ; next}    
              {if ($3 == "Info1") print $1"      ", " "$2, " "$3, " "$4, " "$5, " "$6, " "$7, " "$12," "$16, " "$19, " "$9, " "$10}
              {if ($3 == "Info2") print $1"      ", " "$2, " "$3, " "$4, " "$5, " "$6," " $7}
              {if ($3 == "Info3") a=$12}
              {if ($3=="Info4") b=$12}
              {if ($3 == "info5") print $1"      ", " "$2, " "$3, " "$4," " $5," "$6, " "$7, " "$9, a, b}
              {if ($1=="Info6") print $1="Moyenne"_+++1, ($4-$3)+1}
              {if ($1=="info6" A[$2]=$1; next };$2 in A { print length = A[$2]}
              }' Fichier1 - > fichierTri
    Si il traite le fichier 1 d'abord, comment faire la transition au fichier 2 ? Faut-il ajouter autre chose ?

    Avec le code, il ne reconnait pas le A
    En rouge, partie suspecte, comme elle est au début du code, elle n'a rien a faire là, c'est donc tout le bloc qui ne sert à rien.

    Bon allez, je vais être sympa, voici une version corrigé (mais non testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    awk -F\| 'FNR == NR {A[$2]=$1 ; next}
              /#/ {next} 
              {gsub(/;/,"\t")}
              $3 == "Info1" {print $1"      ", " "$2, " "$3, " "$4, " "$5, " "$6, " "$7, " "$12," "$16, " "$19, " "$9, " "$10}
              $3 == "Info2" {print $1"      ", " "$2, " "$3, " "$4, " "$5, " "$6," " $7}
              $3 == "Info3" {a=$12}
              $3 == "Info4"  {b=$12}
              $3 == "info5" {print $1"      ", " "$2, " "$3, " "$4," " $5," "$6, " "$7, " "$9, a, b}
              $1 == "Info6" {print $1="Moyenne"_+++1, ($4-$3)+1}
              $2 in A { print length = A[$2]}' Fichier1 Fichier2 > fichierTri
    Cordialement.

  3. #23
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    je vais être sympa
    à l'occasion, tu pourrais passer expliquer à mes chatons comment démêler une pelote de laine ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #24
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Avec plaisir, dés que j'aurai réussi à l'expliquer à mon chat: en 3 ans d'essais, il n'y arrive toujours pas, mais je le suspecte le faire exprès
    Cordialement.

  5. #25
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut
    Un grand merci
    J'ai pu résoudre mon problème grâce à vous.

    J'ai une question :
    j'ai un fichier sous cette forme :

    216 un|mot|collé

    je voudrais enlever le "|" et le remplacer par un espace, j'ai essayé avec sed, mais ça ne marche pas

    Merci encore

  6. #26
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    ça marche pas
    Citation Envoyé par NBaH
    illustrer ton propos par des exemples [représentatifs et] cohérents.
    y compris quand ça ne fait pas ce que tu souhaites.
    de plus,
    nouvelle question -> nouveau sujet.

    merci.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #27
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut
    J'ai pu résoudre avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s+|+ +g" fichier >resultat]
    Merci encore pour l'aide

  8. #28
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Shyma Voir le message
    216 un|mot|collé

    je voudrais enlever le "|" et le remplacer par un espace,

    J'ai pu résoudre avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s+|+ +g" fichier >resultat]
    Attention à ta formulation. Désires-tu "enlever et remplacer" (c'est à dire modifier le fichier d'origine) ou bien générer un second fichier contenant une copie modifiée du premier ??? Parce que ta solution correspond à la seconde option mais celle-ci ne répond pas à ta question...

    Citation Envoyé par Shyma Voir le message
    j'ai essayé avec sed, mais ça ne marche pas
    Super ce genre d'info. Surtout ne nous dis pas comment tu as essayé ni la syntaxe que tu as utilisé, ce serait trop facile !!!

    Pour info chez-moi, je tape sed -e "s/|/ /g" fichier et ça marche !!!

    Et sinon voici une solution possible pour répondre à ta question initiale, à savoir "enlever et remplacer"
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3<fichier_a_modifier
    rm -f fichier_a_modifier
    sed -e "s/|/ /g" 0<&3 >fichier_a_modifier
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #29
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Très instructif pour les redirections.
    Il me semble que c'est plus simple comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sed -i 's/|/ /g' fichier_a_modifier
    ou bien avec tr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf "$(tr "|" " " <fichier_a_modifier)" >fichier_a_modifier
    Cordialement.

  10. #30
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    quel est l'intérêt du printf ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #31
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    Très instructif pour les redirections.
    Très instructif ta seconde écriture

    Dans la mienne le seul point chaud c'est le "rm" qu'on ne peut pas éviter (il faut déconnecter le nouveau "fichier" de l'ancien sinon le nouveau écrase l'ancien et donc le canal 3, lui aussi connecté à l'ancien, est vidé par ricochet). Donc je pense que je vais adopter ta façon de faire. Faut juste que je vérifie si elle peut accepter n'importe quelle taille de fichier input (j'ai testé la mienne sur des fichiers de plusieurs Go sans souci)

    Citation Envoyé par ctac_ Voir le message
    Il me semble que c'est plus simple comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sed -i 's/|/ /g' fichier_a_modifier
    Oui, effectivement "sed" implémente une option qui lui permet d'être intéractif avec le fichier. Je l'avais oubliée et donc j'ai utilisé une syntaxe générique qui fonctionne donc avec toute commande quelle qu'elle soit. On aurait donc pu l'utiliser aussi avec "tr".
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3<fichier_a_modifier
    rm -f fichier_a_modifier
    tr "|" " " 0<&3 >fichier_a_modifier

    Et ta syntaxe aurait fonctionné aussi avec "sed": printf "$(sed -e "s/|/ /g" <fichier_a_modifier)" >fichier_a_modifier...

    Citation Envoyé par N_BaH Voir le message
    quel est l'intérêt du printf ?
    Je pense que c'est à cause du sous-processus $(...) qui est obligatoire afin que le shell ne commence pas par écraser le fichier à modifier. Et comme ce qu'affiche ce sous-processus doit lui-même être affiché pour être redirigé, ben printf. Ou echo...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #32
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Pour rappel, un processus fils hérite de l'environnement de son père, descripteur de fichier compris, mais le père lui n'hérite pas du fils.
    La redirection de l'entrée vers le fichier dans le processus fils, ne modifie pas l'entrée du processus parent, et donc, on a bien une attache active sur le fichier en question.
    Le parent crée un nouveau fichier (principe de la redirection simple), mais le fait de donner le même nom qu'un fichier existant, écrase du même coup la référence vers les données du fichier existant, par contre les descripteurs déjà ouverts continu de pointer sur ces données.
    En bref, la méthode est similaire à la méthode via duplication fd puis rm du fichier.
    L'avantage que je vois par la méthode du rm par rapport à la méthode du processus fils, c'est que l'on peut utiliser la double redirection et pouvoir aussi utiliser relire les données du nouveau fichier sans avoir épuisé la lecture de l'ancien fichier.
    Ou des trucs plus sympa, exemple ici, difficile à refaire via la méthode du processus fils:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ F=$(mktemp tmp.XXXXXX)
    $ exec 3<> $F
    $ rm $F
    $ echo foo >&3
    $ cat /dev/fd/3
    foo
    $ echo bar >&3
    $ cat /dev/fd/3
    foo
    bar
    Cordialement.

  13. #33
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    J'ai une autre question : si je veux comparer entre deux fichiers dont le premier est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      ##classe
    premier          abc    12 09 6            personne=nom1 17 20; 
    premier          abc     11 9  6            personne=nom1 16 19 ;
    premier         abc     30 9 15           personne=nom1 14 19 ;
    ##classe
     
    deuxième       abc     5 7 9            personne=nom2 15 17  ;
    deuxième       abc     56 5 9          personne=nom2 10 20  ;
    deuxième      abc     8 9 4           personne=nom2  8 13;
    deuxième     abc    1 56 7           personne=nom2 5 12 ;
    et le deuxième est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     4 nom8
    1 nom2
    19 nom3
    7 nom1
    Je voudrais donc voir si le nom1, nom2 y figurent dans le fichier 2, et afficher la note qu'il y a à coté de leur nom, mais l'afficher une fois, vu que (nom1, et nom2) sont répétés plusieurs fois dans le fichier 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      awk  'FNR == NR {A[$2]=$1 ; next}  {gsub(/=/,"\t") }{gsub(/#/,"\t") }  ($2 == "abc"){ print $1"   ",  $2"    ",  $3"    ",  $4"    ",  $5"   "}   ($1=="classe") {print $1="classe_"_+++1}($7 in A) { print A[$2]}  ' fichier2 fichier1 >resultat
    le problème c'est qu'il ne m'affiche pas le A[$2]

    Une autre problématique, mais là je n'ai aucune idée comment faire, je voudrais dans le fichier 1, pour chaque classe, faire l'addition de la différence entre les deux notes [(20-17)+(19-16)+(19-14)], et l'enregistrer dans une variable pour l'utiliser après dans un calcul, donc, comment faire pour délimiter le champ entre les classes, pour faire les calculs automatiquement que sur ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     premier          abc    12 09 6            personne=nom1 17 20; 
    premier          abc     11 9  6            personne=nom1 16 19 ;
    premier         abc     30 9 15           personne=nom1 14 19 ;


    Merci

  14. #34
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    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 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Citation Envoyé par Shyma Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      awk  'FNR == NR {A[$2]=$1 ; next}  {gsub(/=/,"\t") }{gsub(/#/,"\t") }  ($2 == "abc"){ print $1"   ",  $2"    ",  $3"    ",  $4"    ",  $5"   "}   ($1=="classe") {print $1="classe_"_+++1}($7 in A) { print A[$2]}  ' fichier2 fichier1 >resultat
    Pour faire simple,
    Tu es au rayon bonbon, et tu demandes s'ils ont des fraises tagada, ils te répondent oui, et toi tu leur dit ok, donner moi le pain que cela représente...
    Citation Envoyé par Shyma Voir le message
    le problème c'est qu'il ne m'affiche pas le A[$2]

    Une autre problématique, mais là je n'ai aucune idée comment faire, je voudrais dans le fichier 1, pour chaque classe, faire l'addition de la différence entre les deux notes [(20-17)+(19-16)+(19-14)], et l'enregistrer dans une variable pour l'utiliser après dans un calcul, donc, comment faire pour délimiter le champ entre les classes, pour faire les calculs automatiquement que sur ça?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     premier          abc    12 09 6            personne=nom1 17 20; 
    premier          abc     11 9  6            personne=nom1 16 19 ;
    premier         abc     30 9 15           personne=nom1 14 19 ;


    Merci
    Pas du tout claire la question, de plus, pour un nouveau problème, on ouvre une nouvelle discussion.
    Cordialement.

Discussions similaires

  1. Comparaison entre deux fichiers JS
    Par Cvanhove dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 12/05/2016, 21h04
  2. [Débutant] Comparaisons entre deux fichiers textes
    Par shootgirl dans le forum MATLAB
    Réponses: 9
    Dernier message: 27/09/2011, 14h50
  3. Comparaison entre deux tables
    Par Bes74 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/08/2007, 20h04
  4. Comparaison entre deux dates dans une table
    Par Biskot75 dans le forum Access
    Réponses: 6
    Dernier message: 19/09/2006, 11h16
  5. Comparaison entre deux champs de deux tables différentes
    Par liam81150 dans le forum Requêtes
    Réponses: 1
    Dernier message: 26/09/2005, 20h53

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