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

Linux Discussion :

éclater un fichier suivant des critères de rupture


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut éclater un fichier suivant des critères de rupture
    Bonjour,

    J'aimerais savoir comment éclater un fichier en plusieurs suivant un certain nombre de critère de rupture. Par exemple, dans le fichier suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    jean    21ans coiffeur
    pierre  32ans livreur
    jacques 22ans livreur
    marc    27ans coiffeur
    bastien 28ans serveur
    je voudrais un fichier par profession disons.
    je sais trier le fichier, mais pour scinder en plusieurs fichier quand la profession change, je sais pas faire.

    Merci d'avance.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 685
    Par défaut
    en Bash ?

    Il n'est pas nécessaire de trier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while read line
     do
       echo "$line" >> pro-${line##* }.out
    done < ton_fichier.in
     
    cat pro-coiffeur.out
    jean 21ans coiffeur
    marc 27ans coiffeur
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    Oui, c'est bien en bash que je veux faire ça.

    Je ne comprend pas bien ton code, désolé...

    Que signifie ##* ici ?

    Comment indiquer l'emplacement des critères de rupture ? Par exemple, si je veux cette foix-ci un fichier par profession et age :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    jean     21ans coiffeur
    pierre   32ans livreur
    jacques  22ans livreur
    marc     27ans coiffeur
    bastien  28ans serveur
    paul     21ans coiffeur
    eustache 27ans coiffeur
    armant   28ans coiffeur

    Ce truc là marche, mais je sais pas s'il y a plus simple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    critere1 = `echo "$line" | cut -b "10 11 12 13 14"`
    critere2 = `echo "$line" | cut -b "16 17 18 19 20 21 22 23"`
    echo "$line" >> pro-${critere1}-${critere2}.out
    ...
    Merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    Bon, le truc précédent marche, cependant les performances ne sont pas suffisante. Ca ressemble à 1 ligne par seconde, alors que j'ai 100 000 lignes à traiter....

    Est-ce qu'il y a un autre moyen en bash ? Ou je dois faire un programme ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 685
    Par défaut
    Citation Envoyé par apqmwnqmap
    Je ne comprend pas bien ton code, désolé...

    Que signifie ##* ici ?
    regarde le man

    Tu pourrais mettre les noms des "champs" dans un tableau-liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array=( nom age profession )
    Si tu souhaites énumérer les champs à afficher dans les différents fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while read ${array[@]}
     do
       echo "$nom $age $profession" >> ${age}-${profession}.out
    done < ton_fichier.in
    ou, plus baroquement, pour envoyer tous les champs dans les fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read ${array[@]}
     do
       eval echo "$(printf '${%s}\t' ${array[@]})" >> ${age}-${profession}.out
    done < ton_fichier.in
    ...
    ?

    Pour 100 000 lignes, il faut envisager un code en awk, ou en perl.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 685
    Par défaut 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
    #!/usr/bin/perl
        use strict;
        use warnings;
     
    my $file = "ton_fichier.in";
    open(INFILE, $file) or die "Impossible d'ouvrir $file\n";
    while (<INFILE>) {
       chomp;
       my @array = split(/ +/, $_);
       my $sortie = "$array[1]-$array[2].out";
       open(OUTFILE, '>>' , $sortie) or die("Impossible d'écrire dans $sortie");
       print OUTFILE "$_\n";
       close(OUTFILE);
    }
    close(INFILE);
    ça m'a l'air lourdingue...
    ?

    edit: je ne trouve pas de gain de temps d'exécution sur un aussi petit fichier, sans doute sur tes 100.000 lignes...
    tu nous tiens au courant ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 158
    Par défaut
    J'ai fais ça (parce qu'en fait, j'ai pas de séparateur)

    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
     
    #!/usr/bin/perl
        use strict;
        use warnings;
     
    my $file = "FTR001A";
    open(INFILE, $file) or die "Impossible d'ouvrir $file\n";
    while (<INFILE>) {
       chomp;
     
       my $critere1 = substr $_, 0, 7;
       my $critere2 = substr $_, 174, 20;
       my $critere3 = substr $_, 194, 20;
       my $critere4 = substr $_, 214, 20;
       my $critere5 = substr $_, 234, 1;
       my $critere6 = substr $_, 122, 6;
     
       my $sortie = "${critere1}_${critere2}_${critere3}_${critere4}_${critere5}_${critere6}.out";
       open(OUTFILE, '>>' , $sortie) or die("Impossible d'écrire dans $sortie");
       print OUTFILE "$_\n";
       close(OUTFILE);
    }
    close(INFILE);
    Et ça marche rapidement !

    Merci beaucoup

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

Discussions similaires

  1. [XL-2003] Copier les couleurs suivant des critères.
    Par annad dans le forum Excel
    Réponses: 9
    Dernier message: 17/08/2009, 14h51
  2. Champ calculé suivant des critères
    Par Houmem dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 11/01/2009, 19h40
  3. Réponses: 12
    Dernier message: 13/08/2008, 17h04
  4. [VTemplate] Choix suivant des critères comme le support Php5, code Xhtml compliant ?
    Par El Riiico dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 05/12/2005, 10h28
  5. lister des fichiers selon des critères
    Par Corben dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 18/10/2005, 16h52

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