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] Utiliser un fichier de sortie comme fichier d'entrée dans un script bash


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Femme Profil pro
    Geologue
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Geologue
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [awk] Utiliser un fichier de sortie comme fichier d'entrée dans un script bash
    Bonjour,

    je suis nouvelle sur le site et j'espere être au bon endroit.

    Je dois écrire un script sous Bash et je n'arrive pas trouver mon problème sur internet. Je vous explique: J'ai deux lignes avec awk et j'aimerai lire mon output de ma premiere commande et executer ma deuxieme ligne avec cet output (qui est donc mon input ici).

    Premiere ligne: je veux modifier ma colonne 2 du fichier1 en changeant les "_" par "-". Ma ligne marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN {FS=OFS=";"} {gsub(/_/,"-",$2)}1 file1.txt
    Deuxieme ligne: je compare deux fichiers differents dont mon fichier1 modifié précédement. Ma ligne marche aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN {FS=OFS=";"} FNR==NR {a[$2]=$0; next}{print $0,a[$2]?a[$2]:"NA"}' file2.txt file1.txt >file3.txt
    Mais j'aimerai pouvoir le faire dans un script en obtenant toutes mes modifications dans mon fichier3.

    J'aurai par la suite d'autre modifications à faire sur ma colonne2 du fichier1 donc j'aimerai pouvoir à chaque fois reutiliser mon fichier de sortie..

    Je n'arrive pas à trouver sur internet comment lire mon output dans un script et le reutiliser dans ma deuxieme commande.

    Quelqu'un pour m'aider??

    Merci Beaucoup !!!

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour et Bienvenue,

    Pense à utiliser les balise code ( bouton avec le # ) pour tes lignes de code

    Sinon, pour répondre à ta question, ton problème est simple, dans l'ordre, les actions à réaliser:
    -Traiter le fichier2: FNR==NR {a[$2]=$0; next}.
    -Modification du fichier1 à la volée: {gsub(/_/,"-",$2)}.
    -Intersection des 2 fichiers: {print $0,a[$2]?a[$2]:"NA"}.

    Bon là, tout est écrit et faisable en un seul awk...
    Cordialement.

  3. #3
    Candidat au Club
    Femme Profil pro
    Geologue
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Geologue
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ta rapide réponse !!

    Deux petites questions me taraude: J'ai du mal à visualiser comment on sait que ta deuxieme ligne à la volèe ne s'applique qu'a mon fichier1? et si je veux aussi passée cette même colonne en majuscule, je mets le code à la suite aussi, juste avant de comparer mes deux fichiers?

    Merci beaucoup en tout cas !!

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    J'ai du mal à comprendre ton incompréhension, je n'ai fait que te donner l'ordre dans lequel exécuter tes propres lignes de code.
    Il semblerait que tu n'as pas compris le rôle des variables FNR et [C]NR[C] ainsi que l'utilisation que tu en fais.
    Si on fait simple:
    Awk est un automate qui exécute séquentiellement des blocs de codes selon la véracité d'une condition de chaque ligne du flux en entrée, ce qui donne par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN{code} #Ici on exécute du code avant la lecture de la toute première ligne de flux
    COND1 {code1} #Ici, une ligne de flux est dans $0 et on exécute le code1 si la COND1 est vrai
    COND2 {code2} #On exécute code2 si COND2 est vrai
    ...
    ...
    END{code} #Ici, on exécute du code lorsque tous les flux sont épuisés
    Les blocs BEGIN en END sont facultatifs bien sûr et dans tous les cas BEGIN sera toujours exécuté ainsi que END sauf sortie prématuré du programme suite à une exception ou l'instruction exit.
    Après tu as des instructions tels que next, qui permet de passer au cycle suivant avec une nouvelle ligne de flux (ou d'aller directement au bloc END, si on avait déjà lu la dernière ligne de tous les flux).
    La variable FNR est le compteur de ligne du flux en cours (chaque fichier est un flux)
    La variable NR est le compteur de ligne traité par le programme (indépendamment de chaque flux)
    Et donc, la comparaison FNR==NR nous permet de savoir que nous sommes en train de lire le premier (et uniquement le premier) flux (ou fichier si tu préfères).
    Cordialement.

  5. #5
    Candidat au Club
    Femme Profil pro
    Geologue
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Geologue
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup effectivement le FNR==NR m'avait un peu échapé.. C'est beaucoup plus clair.

    et si je veux rajouter une ligne pour les majuscules toujours sur ma colonne 2 du fichier 1, je fais un truc comme ca? je peux rajouter autant de fonction que je veux?
    J'ai essayé j'ai une erreur de syntaxe quelque part..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN {FS=OFS=";"} FNR==NR {a[$2] = $0; next} {gsub(/_/,"-",$2)} {tolupper($2)} {print $0,a[$2]?a[$2]:"NA"}' $File2 $File1 > file3.csv
    En tout cas merci beaucoup pour ton aide, pas facile de s'y mettre seule mais challenging !!!

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    tolupper n'existe pas, c'est toupper, et cette fonction ne modifie pas la chaine, elle renvoie une copie, donc c'est $2=toupper($2).
    et autant centraliser dans un même bloc de code quand ça concerne plusieurs actions sans conditions particulières pour une même ligne, donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN {FS=OFS=";"} FNR==NR {a[$2] = $0; next} {gsub(/_/,"-",$2)} {tolupper($2)} {print $0,a[$2]?a[$2]:"NA"}' $File2 $File1 > file3.csv
    devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN {FS=OFS=";"} FNR==NR {a[$2] = $0; next} {gsub(/_/,"-",$2);$2=toupper($2);print $0,a[$2]?a[$2]:"NA"}' $File2 $File1 > file3.csv
    Cordialement.

  7. #7
    Candidat au Club
    Femme Profil pro
    Geologue
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 36
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Geologue
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Super, Ca marche !!!

    Merci beaucoup, je commence à comprendre le fonctionnement !!!

    Thanks

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Script pour comparer fichiers csv et créer fichier de sortie
    Par rlelamer dans le forum AppleScript
    Réponses: 6
    Dernier message: 13/06/2017, 22h21
  2. drag/drop de fichier dans un script bash
    Par mrttlemonde dans le forum Administration système
    Réponses: 10
    Dernier message: 03/10/2009, 18h14
  3. Redirection de sortie standard dans un script bash
    Par redvivi dans le forum Linux
    Réponses: 4
    Dernier message: 07/09/2008, 21h19
  4. Réponses: 5
    Dernier message: 16/03/2007, 12h16
  5. Réponses: 13
    Dernier message: 10/11/2006, 09h24

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