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] Déplacer des lignes vers le haut


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Par défaut [awk] Déplacer des lignes vers le haut
    Bonjour ,
    Je voudrais déplacer certaines lignes vers le haut dans mon fichier, qui se présente de cette manière


    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
     
    classe
    prenom age  David 19
    prenom age  David 19
    prenom age  David 19
    prenom age  David 19
    classe 8 12
    prenom age Lucie 18
    prenom age Lucie 18
    classe 5 45
    prenom age Eric 17
    prenom age Eric 17
    prenom age Eric 17
    prenom age Eric 17
    classe 12 28 
     
    ....etc

    Pour avoir un fichier de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    classe 8 12
    prenom age  David 19
    prenom age  David 19
    prenom age  David 19
    prenom age  David 19
    classe 5 45
    prenom age Lucie 18
    prenom age Lucie 18
    classe 12 28 
    prenom age Eric 17
    prenom age Eric 17
    prenom age Eric 17
    prenom age Eric 17

    Merci pour votre aide

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    j'imagine que tu as essayé un certain nombre de choses avant de poser la question ici, tu as un début de code à nous montrer ?
    (les précédentes questions que tu as posé sur awk et pour lesquelles des réponses t'ont été apportées devraient normalement déjà bien t'aider à l'utiliser)

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Si je devais le faire, je parcourrais le fichier à l'envers (avec la commande "tac"), puis, avec "awk", j'enregistrerais la ligne commençant par "classe" pour l'imprimer avec un coup de retard (je trouve que c'est plus facile qu'un coup d'avance (sans les propriétés endochroniques de la thiotimoline resublimée)), ainsi qu'à la fin, si besoin, puis on remet le fichier dans l'ordre avec "tac", et le tour est joué.

  4. #4
    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,
    Citation Envoyé par jack-ft Voir le message
    Si je devais le faire, je parcourrais le fichier à l'envers (avec la commande "tac"), puis, avec "awk"
    J'étais parvenu à la même conclusion, mais avec sed

    Nom : Sélection_305.png
Affichages : 530
Taille : 78,3 Ko

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

    Ou simplement juste en sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ sed -n '/^\(classe\)* *$/d;/classe/!H;/classe/{p;x;s/.//p;s/.*//;x;}' fichier.txt
    classe 8 12
    prenom age  David 19
    prenom age  David 19
    prenom age  David 19
    prenom age  David 19
    classe 5 45
    prenom age Lucie 18
    prenom age Lucie 18
    classe 12 28
    prenom age Eric 17
    prenom age Eric 17
    prenom age Eric 17
    prenom age Eric 17

  6. #6
    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,
    Citation Envoyé par disedorgue Voir le message
    Ou simplement juste en sed:
    $ sed -n '/^\(classe\)* *$/d;/classe/!H;/classe/{p;x;s/.//p;s/.*//;x;}' fichier.txt
    Bien joué

    Au passage, juste pour signifier qu'avec GNU sed, s/.*// peut être remplacé par la commande "z" pour vider l'espace de travail

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    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 361
    Par défaut
    C'est vrai qu'il y a le petit "z", je l'avais oublié celui-là (Merci ).
    D'ailleurs, je vois aussi que j'aurai pu l'écrire en plus court en inversant les parenthèses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^\(classe\)* *$/d;/classe/!{H;b;};p;x;s/.//p;s/.*//;x'
    et avec le "z":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^\(classe\)* *$/d;/classe/!{H;b;};p;x;s/.//p;z;x'
    Pour les puristes, la première '*' de la première regex peut-être remplacée par '\?' car le but ici est de trouver au plus une fois le mot classe en début de ligne et/ou éventuellement des espaces.

    PS: la solution en awk est presque aussi courte

Discussions similaires

  1. Déplacer une ligne vers ou haut ou le bas d'une Listebox
    Par fmris dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/02/2014, 10h26
  2. [XL-2003] Déplacer une ligne vers le haut ou vers le bas
    Par rjf18 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/01/2010, 21h59
  3. Déplacer des lignes dans une autre feuille
    Par dj-julio dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 22/11/2007, 09h24
  4. pivoter des lignes vers une colonne
    Par ashtur dans le forum Oracle
    Réponses: 1
    Dernier message: 02/05/2007, 13h59
  5. VBA EXCEL - Copier des ligne vers un autre calseur.
    Par patine31 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/03/2007, 12h46

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