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 :

Comment supprimer avec la commande sed les n premières lignes d'un fichier, moins une ligne ?


Sujet :

Shell et commandes GNU

  1. #21
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Pour la petite explication, c'est du booléen, par défaut awk affiche son $0 si la condition d'entrée est vraie, pour la partie /Cle/ awk evalue et afficherait par défaut le $0 mais ici non, puisqu'il a un bloc à executer: {x=1}.
    Puis, il continue pour l'autre condition d'entrée qui est x, et comme au départ x n'est pas initialisé (on aurait pu l'initialiser à 0) awk la voit donc comme fausse et donc ne fait rien. ensuite quand /Cle/ devient vrai , on initialise x à autre chose que 0 afin que quand awk le vérifie en tant que condition, celui-ci est vrai et donc affiche $0.

    PS: ça serait interressant de le faire aussi via grep
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    je ne comprends toujours pas l'utilité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ echo 'A.BIDON..1;LIRE..1;explication..1
    A.BIDON..2;LIRE..2;explication..2
    A.BIDON...;LIRE...;explication...
    A.BIDON..n;LIRE..n;explication..n
    Cle0000001;XAVIER;20;15,20;Wait&see;;;;;;;;;
    Cle0000002;JODY**;26;13,50;Wait&see;500;7,70;Wait&see;20201029;14,50;12,90;;;
    CRAPEAU' | awk '/^Cle/'
    Cle0000001;XAVIER;20;15,20;Wait&see;;;;;;;;;
    Cle0000002;JODY**;26;13,50;Wait&see;500;7,70;Wait&see;20201029;14,50;12,90;;;
    $
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #23
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je ne comprends toujours pas l'utilité
    C'est sûr que si le but est juste d'obtenir les lignes "Cle", un bête grep suffit. On peut aussi jouer avec sed ou awk mais l'intérêt retombe vite.

    Certains sont alors partis du principe qu'on devait afficher (déjà dit mais la répétition est la base de la pédagogie) toutes les lignes quelles qu'elles soient à partir de la première ligne "Cle". C'est à dire qu'à partir de la première ligne "Cle", on affiche tout y compris les lignes "pas Cle" (donc ton CRAPEAU doit s'afficher aussi)
    Exemple (les lignes à afficher sont en rouge)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A.BIDON..1;LIRE..1;explication..1
    A.BIDON..2;LIRE..2;explication..2
    A.BIDON...;LIRE...;explication...
    A.BIDON..n;LIRE..n;explication..n
    Cle0000001;XAVIER;20;15,20;Wait&see;;;;;;;;;
    toto
    yiyi
    Cle0000002;JODY**;26;13,50;Wait&see;500;7,70;Wait&see;20201029;14,50;12,90;;;
    Cle0000003;CLAIRE;;;;;;;;;;;;
    Et là les solutions un peu plus exotiques ont commencé à arriver...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #24
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    PS: ça serait interressant de le faire aussi via grep
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    Citation Envoyé par Sve@r
    afficher (déjà dit mais la répétition est la base de la pédagogie) toutes les lignes quelles qu'elles soient à partir de la première ligne "Cle".
    oui, oui, bien sûr ! c'est ça qui m'échappait.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #26
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep '^Cle' -A $(wc -l fichier)
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -zo 'Cle.*' fichier
    Cordialement.

  7. #27
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 159
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    Que de réponses !

    Voici quelques précisions :
    1/ ce que l'on veut :
    à partir du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    A.BIDON..1;LIRE..1;explication..1
    A.BIDON..2;LIRE..2;explication..2
    A.BIDON...;LIRE...;explication...
    A.BIDON..n;LIRE..n;explication..n
    Cle0000001;XAVIER;20;15,20;Wait&see;;;;;;;;;
    Cle0000002;JODY**;26;13,50;Wait&see;500;7,70;Wait&see;20201029;14,50;12,90;;;
    Cle0000003;CLAIRE;;;;;;;;;;;;
    ...
    On veut obtenir ce fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Cle0000001;XAVIER;20;15,20;Wait&see;;;;;;;;;
    Cle0000002;JODY**;26;13,50;Wait&see;500;7,70;Wait&see;20201029;14,50;12,90;;;
    Cle0000003;CLAIRE;;;;;;;;;;;;
    ...
    On veut donc épurer le fichier en ne gardant que les lignes où apparaissent les clés.

    2/ On ne connait pas le nombre de lignes "bidon"s à supprimer, et ces lignes ne contiennent pas le mot "BIDON"
    (Dans l'exemple, j'ai mis "BIDON" pour signifier qu'elles étaient à exclure.)

    3/ Pour les lignes "clés" à garder, les clés sont sur 10 caractères, mais ne comportent pas le mot "Cle".
    (Dans l'exemple j'ai mis "Cle" pour signifier qu'elles étaient à garder.)

    J'ai tardé à répondre, car j'ai un écran noir au démarrage d'Ubuntu 18.04 LTS (pourtant la machine a l'air de tourner); et je poste depuis un autre ordi.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    les "clés" sont-elles les seules lignes dont le premier champ comporte (strictement ?) 10 caractères (alphanumériques ? des ponctuations ? ... ?) ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #29
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Citation Envoyé par Liamm Voir le message

    J'ai tardé à répondre, car j'ai un écran noir au démarrage d'Ubuntu 18.04 LTS (pourtant la machine a l'air de tourner); et je poste depuis un autre ordi.
    Essaye CTRL+ALT+F2 ou F3 pour voir si tu arrive à avoir une console...

    Si c'est le cas, forte probabilité que c'est X11 qui est mal paramêtré, enfin si c'est lui que tu utilises (si c'est le cas, essaye de passer à Wayland si tu ne joues pas à des jeux gourmand graphiquement sous linux).
    Cordialement.

  10. #30
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Liamm Voir le message
    Alors, comment supprimer toutes les lignes bidons dont on ne connaît pas le nombre, et ne garder que les lignes clés dont on sait que cle0000001 est la première ?
    Si la spécification est effectivement de garder toutes les lignes à partir de la ligne clé qui commence par "Cle0000001", il suffit de faire, avec "sed":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^Cle0000001;/,$p' fichier.csv
    ou, avec "awk", d'après Sve@r:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN {flag=0} {if ($0 ~ /^Cle0000001;/) found=1; if (found != 0) print $0}' fichier.csv

  11. #31
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Liamm Voir le message
    2/ On ne connait pas le nombre de lignes "bidon"s à supprimer, et ces lignes ne contiennent pas le mot "BIDON"
    (Dans l'exemple, j'ai mis "BIDON" pour signifier qu'elles étaient à exclure.)

    3/ Pour les lignes "clés" à garder, les clés sont sur 10 caractères, mais ne comportent pas le mot "Cle".
    (Dans l'exemple j'ai mis "Cle" pour signifier qu'elles étaient à garder.)
    Ah ben ça nous a bien foutu dedans. Nous on se basait soit sur la string explcite "BIDON", soit sur la string explicite "Cle".

    Toutefois si tu veux un algo qui conserve telles et telles lignes à l'exclusion de telles et telles autres, alors tu dois donner à l'algo un schéma soit des lignes à conserver, soit des lignes à exclure. Et étant donné que toi tu sais quelles lignes garder (ou exclure) ça veut dire que tu sais les reconnaitre donc ce schéma existe au-moins dans ta tête. Ne reste qu'à le convertir en expression mathématique pour ensuite l'inclure dans ton code.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #32
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 159
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^Cle0000001;/,$p' fichier.csv
    marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    odi@PC1WGLTE:~/Documents$ sed -n '/^Cle0000001;/,$p' fichier.csv
    Cle0000001;XAVIER;20;15,20;Wait&see;;;;;;;;;
    Cle0000002;JODY**;26;13,50;Wait&see;500;7,70;Wait&see;20201029;14,50;12,90;;;
    Cle0000003;CLAIRE;;;;;;;;;;;;
    Cela répond à la question initiale.
    Cependant :
    - Que veut dire, dans cette commande sed : ",$" ?
    - Existe-t-il une documentation de la commande sed, de préférence écrite en français, que tu me recommanderais. (où ça explique notamment le ",$") ?

  13. #33
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    $ est l'adresse de la dernière ligne du fichier.

    Documentation : sed.zip
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  14. #34
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Liamm Voir le message
    - Que veut dire, dans cette commande sed : ",$" ?
    Quand on veut imprimer les lignes de 5 à 7, on fait 5,7p.
    Pour imprimer de la première à la dernière 1,$p.

    Comme mon premier éditeur de texte était ed (oui, ça date un peu), j'ai beaucoup utilisé les commandes comme 5,7s/a/b/g (remplacer "a" par "b" dans les lignes de 5 à 7).

    Pour imprimer les lignes depuis celle qui contient un pattern à celle qui contient un autre pattern /premier/,/dernier/p.

    etc.

  15. #35
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Liamm Voir le message
    Citation Envoyé par Liamm Voir le message
    3/ Pour les lignes "clés" à garder, les clés sont sur 10 caractères, mais ne comportent pas le mot "Cle".
    (Dans l'exemple j'ai mis "Cle" pour signifier qu'elles étaient à garder.)
    marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    odi@PC1WGLTE:~/Documents$ sed -n '/^Cle0000001;/,$p' fichier.csv
    Cle0000001;XAVIER;20;15,20;Wait&see;;;;;;;;;
    Cle0000002;JODY**;26;13,50;Wait&see;500;7,70;Wait&see;20201029;14,50;12,90;;;
    Cle0000003;CLAIRE;;;;;;;;;;;;
    Je vois pas comment ça peut marcher étant donné que la commande se base sur la chaine "Cle" (elle signifie littéralement printer (=afficher) depuis la première ligne contenant la string "Cle00000001" jusqu à la fin de fichier et que ton fichier n'est pas censé contenir de chaine "Cle"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #36
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    159
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 159
    Points : 80
    Points
    80
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^Cle0000001;/,$p' fichier.csv
    On garde ou imprime (p) les lignes du fichier fichier.csv et cela, de la ligne commençant par Cle0000001; ('/^Cle0000001;) jusqu'à la dernière ligne (/,$)
    C'est ce qu'on voulait !
    Cette commande répond à la question initiale posée.


    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '1,/^Cle0000001/d' fichier.csv > ftmp1.csv
    On supprime ou delete (d) les lignes du fichier fichier.csv et cela, de la première ligne ('1) jusqu'à la ligne commençant par Cle0000001 (,/^Cle0000001/) incluse
    Ce n'est pas tout à fait ce qu'on voulait !
    Il faudrait que la ligne commençant par Cle0000001 soit excluse et non pas incluse.

    Il semble donc difficile d'utiliser la commande sed avec l'option d pour répondre à notre question.

Discussions similaires

  1. Réponses: 8
    Dernier message: 01/12/2021, 19h42
  2. probléme avec la commande ln (les espaces)
    Par yous18 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 31/03/2008, 10h31
  3. [SQL] Comment faire avec SQL pour que les visiteurs voient la même donnée
    Par syl2042 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 28/08/2007, 15h39
  4. comment compiler avec la commande javac
    Par haksasse dans le forum Langage
    Réponses: 4
    Dernier message: 04/07/2007, 00h14
  5. Problème avec la commande sed
    Par JUSTIN Loïc dans le forum Linux
    Réponses: 2
    Dernier message: 05/09/2006, 11h17

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