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 :

Tri compliqué shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut Tri compliqué shell
    Il faut que je trie mon fichier dans un shell

    Colonne 11 à 20
    Colonne 25 à 29
    Colonne 1 à 2

    Sauf les enregistrements de début et de fin

    merci de votre aide

  2. #2
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    C'est très sibyllin comme message.
    Pourrais-tu mettre quelques enregistrements du fichier source et puis comme tu aimerais les avoir au final? Cela permettrait même de faire des tests...

  3. #3
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut
    Oui merci comme cela :

    avant
    10XXX20080808
    215520JULES
    225520JULES
    325520JULES
    213123CESAR
    223123CESAR
    313123CESAR
    99000000784

    après
    10XXX20080808
    213123CESAR
    223123CESAR
    313123CESAR
    215520JULES
    225520JULES
    325520JULES
    99000000784

  4. #4
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Sans doute ne dois-je pas bien comprendre, mais tu parles de la colonne 29 alors qu'il n'y a que 11 caractères dans tes lignes.

    Pourrais-tu soit mettre de vrais enregistrements, soit expliquer ce que tu appelles colonne?

  5. #5
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut
    Oui pardon j'ai simplifié pour anonymiser
    j'ai mis dans le test
    colonne 7 à 11
    puis colonne 1 à 2

    Le problème est de ne pas bouger la première et la dernière ligne

  6. #6
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    OK, j'ai compris maintenant. Voici comment je ferais:

    1) copier le fichier source sans les premier et dernier enregistrements (fichier_in --> temp_1),
    2) reformatter temp_1 pour faire facilement des tris, notamment en séparant les champs par un espace (par exemple), en créant un champ supplémentaire pour les deux chiffres sur lesquels il faut trier, en mettant le champ le plus important en premier (temp_1 --> temp_2),
    3) trier suivant les deux champs, dont l'un en numérique (temp_2 --> temp_3),
    4) reformatter en sens inverse (temp_3 --> temp_4),
    5) remettre les premier et dernier enregistrements (temp_4 --> temp_5),
    6) vérifier que tout est là, correctement trié, à la main (temp_5 --> fichier_out).

    Pour faire tout ça, faut connaître sort et awk. Tu t'en sors ou tu as besoin d'aide?

  7. #7
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut
    Non j'ai besoin d'aide j'ai du mal à comprendre.
    Et le fichier que j'ai à trier fait 50 000 lignes au moins.
    Et il est quotidien

  8. #8
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Deux remarques:

    1) C'est pas mon boulot, alors on peut au moins partager, non? Es-tu capable d'extraire les données du fichier initial sans les premier et dernier enregistrements? Et puis ensuite de reprendre ces deux enregistrements du fichier initial pour les ajouter au fichier final?

    2) Expose quelques enregistrements réels, avec des données modifiées si tu veux pour éviter de voir surgir mon nom dans un des enregistrements.

  9. #9
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut
    Hélas non l'informatique n'est pas mon métier principal et Linux encore moins.

    Une commande pour arriver à trier le fichier donné en exemple me suffirait.

  10. #10
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Le problème est que tout est dans les détails. Si tu n'y connais rien, une seule option erronée, des guillemets manquants et le programme ne sert plus à rien. Tu ne demandes pas une aide ponctuelle mais de te faire le programme. Ce forum est dédié aux programmeurs, ce que tu avoues ne pas être. Je t'ai donné les deux commandes principales: awk et sort, mais ce n'est évidemment pas suffisant pour un néophyte.

    Quels sont tes arguments pour inciter quelqu'un ici à faire le boulot?

  11. #11
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut
    Le problème est que je viens pour de l'aide pour rédiger une commande précise qui ne me parait pas être la mer à boire.

    il y a une commande wc qui permet de compter les lignes mais mes connaissances linux sont insuffisantes pour en venir à bout.
    Si tu penses qu c'est un gros travail c'est juste que tu n'es pas plus au parfum que moi. Alors espère aussi que j'aurai une réponse.

    Le sort je peux toujours le trouver dans un autre shell mais là il faut que je fasse un tri de la 2ème ligne à la nième ligne moins 1 et attention à la place disque.

  12. #12
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Le problème, je crois, est que tu ne réalises pas ce qu'est ce travail à réaliser. Normal puisque tu ne connais pas le langage de script. Alors "pas la mère à boire" est un jugement un hâtif. De plus, pourrais-tu m'expliquer précisemment ce que tu entends par: "Si tu penses que c'est un gros travail c'est juste que tu n'es pas plus au parfum que moi"?

    Je ne suis pas certain que ce soit le bon chemin pour entamer une coopération. Mais peut-être me montreras-tu le contraire. Je ne demande qu'à être convaincu.

  13. #13
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Citation Envoyé par soledad_001
    Si tu penses qu c'est un gros travail c'est juste que tu n'es pas plus au parfum que moi.
    Au vu des compétences de jmelyn. C'est le genre d'affirmation à éviter soledad_001.

    Toutefois voici une petite aide.
    • Head
    • Tac
      Voir les Man pour comprendre la solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Exemple sur un ls : 
    ls -1 | head --lines=-1 | tac | head --lines=-1 | tac
    Ce début de solution s'applique dans ton cas.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  14. #14
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Heu... Winnt, si j'étais compétent, je devrais connaître tac, mais c'est la première fois que j'entends parler de cette commande. Elle peut être intéressante dans certains cas, je la retiens... Merci! Et pour la solution que tu donnes, j'en ai une autre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ls | tail -n +2 | head -n -1
    Explications:

    * Pour la commande ls, l'option -1 est inutile dans les pipes. Je ne sais pas pourquoi mais la sortie multicolonnes n'est active que vers stdout.

    * La commande tail -x fichier sort les x dernières lignes d'un fichier (en anglais tail veut dire queue): tail -1 sort la dernière ligne, tail -2 fichier les deux dernières lignes, etc. Mais tail -n +x fichier sort les dernières lignes en comptant à partir du début: tail -n +1 fichier sort les lignes à partir de la première, tail -n +2 fichier les lignes à partir de la deuxième, etc.

    * La commande head fonctionne un peu comme tail mais pour le début du fichier (head veut dire tête): head -1 fichier sort uniquement la première ligne, head -2 fichier les deux premières, etc. Mais head -n -x sort les premières lignes sauf les x dernières: head -n -1 fichier sort toutes les lignes saut la dernière, head -n -2 fichier toutes sauf les deux dernières, etc.

    Donc pour éliminer les X premières et Y dernières lignes d'un fichier, cela donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tail -n +(X + 1) fichier_in | head -n -Y > fichier_out
    Il faut bien sûr remplacer (X + 1) par la valeur numérique, sinon il faut appliquer $((X + 1)) avec l'interpréteur Bash, mais cela est une autre histoire.

  15. #15
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    @jmelyn : Je n'ais pas dis que tu connaissais tout Juste que tu étais compétent. Nuance

    Sinon ta solution est interessante elle aussi. Merci
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  16. #16
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut
    mon tri marche sauf les entêtes et pied

    ls |tail -n +2 me donne les lignes sauf l'enreg de tête

    mais je n'arrive pas à supprimer celui de pied, la commande identique ne va pas avec head

  17. #17
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut
    non ce n'est pas çà si je met cette commande en pipe, je perd l'entegistrement d'entête alors que je souhaite le figer

  18. #18
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bravo pour le tri, ce n'était pas un programme trivial. Je suis surpris que tu butes maintenant sur ce petit problème. En voici la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    head -1 fichier_initial > fichier_final
    cat fichier_trié >> fichier_final
    tail -1 fichier_initial >> fichier_final
    Explications:
    fichier_initial est le fichier brut, non encore trié, avec en-tête et pied.
    fichier_final est le fichier comme tu désires l'obtenir.
    fichier_trié est le fichier sans en-tête ni pied, trié comme il faut.

    1ere étape: on met l'en-tête.
    2e étape: on ajoute la partie triée.
    3e étape: on ajoute le pied.

  19. #19
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut
    Oui je bute toujours car jen'ai qu'un seul fichier en sortie.
    Enfin mon tri met la tête aux pieds et le pied en tête. En plus je ne dois pas être sur Linux mais sur Unix car le tac ne fonctionne pas.

  20. #20
    Membre confirmé Avatar de soledad_001
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 101
    Par défaut
    # ajout de la 1ere ligne dans le nouveau fichier :

    cat fichier_source|head -1 > fichier_cible

    # tri des lignes du 2 au n-1 sed ‘1d’ supprime la 1ère ; sed ‘$d’ supprime la dernière

    cat fichier_source|sed -e '$d' -e '1d' | Sort +0.2 -0.10 +0.0 -0.1 >> fichier_cible

    # ajout dernière ligne

    cat fichier_source|tail -1 >> fichier_cible

    Merci à tous de m'avoir aidée

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Tri shell
    Par JetliMohamed dans le forum Pascal
    Réponses: 25
    Dernier message: 24/12/2012, 18h13
  2. [À télécharger] [Tri] Tri de Shell
    Par 3DArchi dans le forum Téléchargez
    Réponses: 0
    Dernier message: 06/11/2010, 20h47
  3. tri par shell
    Par flower_info dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 03/01/2009, 18h27
  4. GAP du tri Shell
    Par katrena99 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 11/01/2008, 20h57

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