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 :

[Shell/Awk] Création de fichiers à partir d'un champ


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut [Shell/Awk] Création de fichiers à partir d'un champ
    Bonjour à tous,

    J'ai plusieurs fichiers (environ 15) qui contiennent tous des lignes de ce type: NOM| PRENOM|AGE|SEXE|TELEPHONE|VILLE

    ce que je voudrai c'est que à partir de tous ces fichiers j'en crée des nouveaux (1 fichier par AGE) contenant uniquement le NOM| PRENOM.

    Ex:
    TITI|TOTO|15|M||PARIS (contenu dans un fichier PARIS.txt)
    TITI2|TOTO2|17|M||Lyon(contenu dans un fichier Lyon.txt)
    TITI3|TOTO3|18|M||PARIS (contenu dans un fichier PARIS.txt)
    TITI4|TOTO|15|M||Lille(contenu dans un fichier Lille.txt)

    Ainsi je souhaite avoir
    1 fichier : 15Ans.txt contenant :
    TITI|TOTO
    TITI4|TOTO
    1 fichier : 17Ans.txt contenant :
    TITI2|TOTO2
    1 fichier : 18Ans.txt contenant :
    TITI3|TOTO3


    Est ce que selon vous c'est possible ?

    Thomas

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'|' 'BEGIN {OFS="|"}{ print $1,$2 >> $3"Ans.txt" }'  fichiers*
    Devrait le faire...

  3. #3
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Salut,

    en sed/awk, je ne sais pas, mais en perl, ça se fait bien :

    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
    $ ll
    total 12
    -rw-r--r-- 1 senga users 23 May  2 14:01 Lille.txt
    -rw-r--r-- 1 senga users 23 May  2 14:01 Lyon.txt
    -rw-r--r-- 1 senga users 46 May  2 14:01 PARIS.txt
    $ cat Lille.txt
    TITI4|TOTO|15|M||Lille
    $ cat Lyon.txt
    TITI2|TOTO2|17|M||Lyon
    $ cat PARIS.txt
    TITI|TOTO|15|M||PARIS
    TITI3|TOTO3|18|M||PARIS
    $ perl -n -e '($nom, $prenom, $age) = split(/\|/); open $fic, ">>", $age."Ans.txt"; print $fic "$nom|$prenom\n"; close $fic;' *.txt
    $ ll
    total 24
    -rw-r--r-- 1 senga users 21 May  2 14:07 15Ans.txt
    -rw-r--r-- 1 senga users 12 May  2 14:07 17Ans.txt
    -rw-r--r-- 1 senga users 12 May  2 14:07 18Ans.txt
    -rw-r--r-- 1 senga users 23 May  2 14:01 Lille.txt
    -rw-r--r-- 1 senga users 23 May  2 14:01 Lyon.txt
    -rw-r--r-- 1 senga users 46 May  2 14:01 PARIS.txt
    $ cat 15Ans.txt
    TITI4|TOTO
    TITI|TOTO
    $ cat 17Ans.txt
    TITI2|TOTO2
    $ cat 18Ans.txt
    TITI3|TOTO3
    Edit: tiens, je viens donc de découvrir qu'on pouvait parfaitement utiliser print ... >> ... dans awk, on en apprend tous les jours

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'|' 'BEGIN {OFS="|"}{ print $1,$2 >> $3"Ans.txt" }'  fichiers*
    Devrait le faire...
    Merci beaucoup ça fonctionne par contre j'ai des doublons dans mes fichiers générés . Est-il possible de n'ajouter que ceux qui n'existe pas encore dans le fichier généré.

    Exemple:

    TITI4|TOTO|15|M||Lille(contenu dans un fichier Lille.txt)
    TITI4|TOTO|15|M||Lille(contenu dans un fichier Lille.txt)
    TITI4|TOTO|15|M||Lille(contenu dans un fichier Lille.txt)
    TITI5|TOTO5|15|M||Lille(contenu dans un fichier Lille.txt)

    Ainsi je souhaite avoir
    1 fichier : 15Ans.txt contenant :
    TITI4|TOTO
    TITI5|TOTO5

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par thomas59000 Voir le message
    par contre j'ai des doublons dans mes fichiers générés . Est-il possible de n'ajouter que ceux qui n'existe pas encore dans le fichier généré.
    Je suppose que tu ajoute des entrées au fur et à mesure dans ce fichier ?

    Peut être serait-il plus approprié d'épurer le fichier par la suite (avec sort)... non ?

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    Effectivement j'ajoute les lignes au fur et à mesure.

    Par contre je sais pas trop si trier serait une solution.
    Je pense que je vais essayer avec un grep.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par thomas59000 Voir le message
    Par contre je sais pas trop si trier serait une solution.
    Je pense que je vais essayer avec un grep.
    C'est ton choix...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ cat 15Ans.txt
    TITI|TOTO
    TITI4|TOTO
    TITI|TOTO
    TITI4|TOTO
    
    $ sort -u 15Ans.txt
    TITI4|TOTO
    TITI|TOTO
    
    $

  8. #8
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Citation Envoyé par thomas59000 Voir le message
    Par contre je sais pas trop si trier serait une solution.
    Je pense que je vais essayer avec un grep.
    sort ne fait pas que des tris : sort -u permet de virer les doublons notamment

    bon, on pourrait le faire en perl aussi, mais je crois que ça n'est pas la peine :p

  9. #9
    Futur Membre du Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Par défaut
    Ah ok comme ça je peux faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for file in `ls *Ans.txt`
    do
       sort -u $file >> TMP$file
       rm $file
       cp $file $file
       rm TMP$file
    done
    Pour ne pas avoir de doublons ou je peux directement le mettre dans mon awk ?

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Il y a peut être moyen de faire ça directement avec "awk" mais comme ce n'est pas mon fort...

    Sinon concernant ta boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for file in `ls *Ans.txt`
    for file in *Ans.txt
    do
    sort -u ${file} > TMP${file} && mv -f TMP${file} ${file}
    rm $file
    cp $file $file
    rm TMP$file
    done

  11. #11
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Je conseillerais plutôt de faire un fichier temporaire en sortie de Awk et de faire le sort vers le fichier définitif, ça évite de se prendre la tête

    Pour le fun, en perl:
    Code perl : 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
    $ cat age.pl
    use strict;
    use warnings;
     
    my $files={};
    while (<>) {
            my ($nom, $prenom, $age) = split(/\|/);
            $files->{$age}->{"$nom|$prenom"}=1;
    }
    foreach my $age (keys %{$files}) {
            open my $fic, '>', $age."Ans.txt";
            foreach my $name (keys %{$files->{$age}}) {
                    print $fic "$name\n";
            }
            close $fic;
    }
    $ perl age.pl *.txt

  12. #12
    Membre expérimenté Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Par défaut
    Aucunement besoin de fichier temporaire avec awk.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    > cat test.t
    TITI|TOTO
    TITI4|TOTO
    TITI|TOTO
    TITI4|TOTO
    > awk '!a[$0]++ { print > FILENAME }' test.t
    > cat test.t
    TITI|TOTO
    TITI4|TOTO
    EDIT : Avec sort non plus d'ailleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    > cat test.t
    TITI|TOTO
    TITI4|TOTO
    TITI|TOTO
    TITI4|TOTO
    > <test.t sort -uo test.t
    > cat test.t
    TITI|TOTO
    TITI4|TOTO

  13. #13
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Citation Envoyé par FRUiT Voir le message
    Aucunement besoin de fichier temporaire avec awk.
    ...
    Intéressant, tu es certain qu'il n'y a aucun risque que awk ou sort ne se mélange les pinceaux avec ce genre de technique ?!

    Je n'avais jamais fait gaffe à l'option -o dans sort, mais du coup, est-ce qu'un sort -u test.t -o test.t ne pourrait pas marcher également ?!

    Edit: ah ouais, selon ce site, ça marche... cool

  14. #14
    Membre expérimenté Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Par défaut
    Pour awk, à mon avis tout dépend de la complexité du script appliqué, ce n'est peut-être pas toujours faisable ainsi.

    Pour sort, a priori je vois pas de restrictions particulières.

    Intéressant ce lien, je garde dans mes tablettes merci ^^

  15. #15
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Je ne sais pas si quelqu'un va lire ceci, mais je suis tombé sur un autre forum sur un sujet ou quelqu'un cherchait à utiliser awk pour modifier un fichier sur lui-même.

    Il a utilisé un truc comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat > test.t
    TITI|TOTO
    TITI4|TOTO
    TITI|TOTO
    TITI4|TOTO
    $ { rm test.t && awk '!a[$0]++ { print }' > test.t; } < test.t
    $ cat test.t
    TITI|TOTO
    TITI4|TOTO
    L'explication :
    The content of the input file becomes stdin for rm and awk, rm ignores it and removes the file, but its file descriptor remains open until both commands (rm and awk) complete, so awk process this "nameless" file and creates a new file.
    Je vous fais même la traduction pour les anglophobes :
    Le contenu du fichier en entrée est passé à l'entrée standard de rm et awk, rm l'ignore et supprime le fichier, mais le descripteur de fichier demeure ouvert jusqu'à ce que les 2 commandes (rm et awk) soient terminées, awk peut donc traiter ce fichier "sans nom" (car il a perdu son nom avec la suppression) et créer un nouveau fichier (qui a donc l'ancien nom du fichier supprimé) sans qu'il n'y ait de conflit !
    Je trouve ça chouette, je ne sais pas si c'est toujours indispensable, mais j'aime

  16. #16
    Membre expérimenté Avatar de FRUiT
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2011
    Messages : 83
    Par défaut
    Ca me parait quand même un tout petit peu moins élégant que FILENAME, mais c'est intéressant quand même, je note je note ^^

  17. #17
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Moins élégant, ça dépend, mais l'utilisation de la redirection dans awk me fait un peu hésiter perso !

    Je trouve que ça ressemble un peu trop à de la redirection shell en terme de présentation, et j'ai peur d'avoir les mêmes problèmes ! Même si je pense que ça n'est pas le cas (comme si tu faisais un sort -u test.t > test.t en fait, ce que tout le monde a fait au début et qui ne marche pas du tout ... alors que { rm test.t && sort -u > test.t; } < test.t passe bien lui... même si l'option -o permet d'éviter le désagrément ).

    Bref, j'aime bien la technique

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/08/2011, 14h47
  2. Réponses: 0
    Dernier message: 28/02/2011, 13h48
  3. Création de fichier à partir d'un bean java
    Par AmFaye dans le forum JSF
    Réponses: 8
    Dernier message: 27/01/2010, 21h05
  4. Pb de création de fichier à partir d'un blob
    Par clairette dans le forum Entrée/Sortie
    Réponses: 20
    Dernier message: 28/08/2006, 09h51
  5. création de tables à partir d'un fichier XML
    Par magic charly dans le forum Oracle
    Réponses: 2
    Dernier message: 03/04/2006, 13h39

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