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 :

Trier un fichier .txt ligne par ligne


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2018
    Messages : 2
    Par défaut Trier un fichier .txt ligne par ligne
    Bonjour,

    J’ai un fichier MonFichier.txt un millier de lignes avec les caractéristiques suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Je:suis:un:ecolier:dans:la:ville:ABCDA
    xxxxxxxxxxxxxxxaxsxss 
    Je:suis:une:femme:dans:la:ville:AADCB
    xxxxxxxxttxxxxxxxxxxxx
    Je:suis:une:fermiere:dans:la:ville:CCDCB
    fseeeeeeeeeeeeeeeeeeeeee
    Je:fus:un:ecolier:dans:la:ville:ABCDA
    eeeeeeeeeeeeeeeeeeeee
    Je:fus:une:fermiere:dans:la:ville:CCDCB
    wddddddddddddddddddd
    .
    .
    .
    .
    Mon problem est le suivant: Je souhaite trier ce fichier en plusieurs fichiers tels que:
    MonFichier_ABCDA.txt: contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xxxxxxxxxxxxxxxaxsxss 
    eeeeeeeeeeeeeeeeeeeee
    MonFichier_ AADCB:
    MonFichier_ CCDCB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fseeeeeeeeeeeeeeeeeeeeee
    wddddddddddddddddddd
    .
    .
    .
    .
    Après des recherches, j’arrive à extraire à peine la liste contenant le 8ème champ des lignes impaires avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F: '{print $8}' MonFichier.txt| sort -u > MonFichier_Liste8eme.txt
    Après je suis coincé. Quelqu’un pourrait-il m’aider? Mille mercis

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Bonjour,

    Voici une façon de faire avec paste qui concatènera les lignes impaires et paires et ensuite passe le tout à awk qui écrira le dernier champs (ligne paire) à la fin du fichier nommé Monfichier_<avant_dernier_champs>.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paste -d ':' - - <MonFichiers.txt | awk -F\: '{print $NF >>"Monfichier_"$(NF-1)".txt";close("Monfichier_"$(NF-1)".txt")}'
    PS: Ici, le awk écrit à la fin des fichiers, il ne les vide pas, donc ne pas oublier de les effacer ou de les vider avant chaque relance.

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut,

    sinon tu fais une boucle qui lit tes lignes une à une, et tu peux faire des tests avant d'envoyer les champs dans différents fichiers.

    Genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Boucle lisant le fichier ligne à ligne et renvoyant la variable ligne découper par les :
    while IFS=':' read -a ligne
    do
      # Ligne avec le nom de fichier
      if [[ -n ${ligne[7]} ]]
      then
        # Variable indiquant l'adresse du fichier de sortie
        fichier="fichier_${ligne[7]}.txt"
      else
        # Envoi de la ligne dans le fichier
        echo "${ligne}" >> "${fichier}"
      fi
    done < fichier

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Similaire à ce que propose disedorgue, mais en déterminant la parité de la ligne dans awk à l'aide du modulo 2 sur le numéro de l'enregistrement courant (la ligne courante):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\: 'NR%2{cf="MonFichier_"$NF".txt"; next}{print >>cf; close(cf)}' MonFichier.txt
    Si la parité de la ligne n'est pas le bon critère, il est facile d'en changer. Par exemple si on prend comme critère que le nombre de champs de l'enregistrement contenant la partie du nom du fichier doit être supérieur à 1, avec : comme séparateur de champs (ce qui dans ce cas autorise plusieurs lignes consécutives):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\: 'NF>1{cf="MonFichier_"$NF".txt"; next}{print >>cf; close(cf)}' MonFichier.txt

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Tu es gentil quand tu dis similaire, ma version ne répond que strictement à son problème ET juste sur l'exemple de l'input donné car elle possède un possible effet de bord: elle n'admet pas le caractère ":" sur les lignes paires.

    Ta solution est largement plus propre et sans l'effet de bord de la mienne

  6. #6
    Candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2018
    Messages : 2
    Par défaut
    Bonjour,
    Je remercie beaucoup disedorgue, hizoka pour vos commentaires qui m'ont tous aidé.
    Un tout tout grand merci à CosmoKnackib. Son code marche parfaitement.

    Je souhaite maintenant que dans les fichiers MonFichier_XXXXX.txt (X=A ou B ou C ou D) générés chaque ligne débute par: XXXXX ehfijghlkhtjlrkjtetjh (XXXXX tab ehfijghlkhtjlrkjtetjh).
    Le contenu de MonFichier_ABCDA.txt: se présenterait comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ABCDA	xxxxxxxxxxxxxxxaxsxss
    ABCDA	eeeeeeeeeeeeeeeeeeeee
    Mille mercis de votre aide

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Et qu'est-ce qui t'empêche de le faire maintenant ?

    Tu as toutes les billes en main en modifiant légèrement le code de CosmoKnacki...

  8. #8
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Tu es gentil quand tu dis similaire...
    Merci, mais sans ta version, je serai passé complètement à coté du problème potentiel dû à l'ouverture de multiples fichiers et de l'utilisation de close() pour y parer.


    Citation Envoyé par Kom_So
    Je souhaite maintenant que dans les fichiers MonFichier_XXXXX.txt (X=A ou B ou C ou D) générés chaque ligne débute par: XXXXX ehfijghlkhtjlrkjtetjh (XXXXX tab ehfijghlkhtjlrkjtetjh).
    Citation Envoyé par disedorgue
    Tu as toutes les billes en main...
    C'est pas faux. La lecture d'un tutoriel sur awk peut aider (=est indispensable), il y en a un sur developpez.net. J'aime bien aussi les ressources de grymoire, et il n'est pas impossible que le livre O'Reilly sur awk soit disponible gratuitement en pdf quelque part.

  9. #9
    Membre Expert
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 562
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    et il n'est pas impossible que le livre O'Reilly sur awk soit disponible gratuitement en pdf quelque part.
    OReilly - Sed & Awk 2nd Edition.pdf – Keybase.pub
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

    Liste des balises BB

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