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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    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 : 164
    Par défaut Comment supprimer avec la commande sed les n premières lignes d'un fichier, moins une ligne ?
    Bonjour,

    Le fichier fichier.csv est de la forme :
    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;;;;;;;;;;;;
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # La Suppression des premières lignes "bidon" :
    #
    sed '1,/^Cle0000001/d' fichier.csv > ftmp1.csv  
    #
    # donne 
    cat ftmp1.csv  
    ==>
    Cle0000002;JODY**;26;13,50;Wait&see;500;7,70;Wait&see;20201029;14,50;12,90;;;
    Cle0000003;CLAIRE;;;;;;;;;;;;
    ...
    Ce qui supprime aussi la première clé (ligne de XAVIER) - la commande fait bien ce qu'on lui demande.

    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 ?

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    bonjour

    Pour faire ton filtre, tu peux utiliser simplement grep ... grep -vi bidon (ou l'inverse)

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Liamm Voir le message
    Ce qui supprime aussi la première clé (ligne de XAVIER) - la commande fait bien ce qu'on lui demande.
    Oui ben tu n'as pas que sed comme commande Unix !!! Unix a été pensé pour les fichiers textes (toute sa configuration se fait à base de fichiers textes) donc il contient aussi des outils divers pour les manipuler dans tous les sens !!!
    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 ?
    Une demande tellement chargée de détails antinomiques qu'elle en perd toute cohérence.
    Soit tu supprimes toutes les lignes "bidon" et dans ce cas tu affiches tout ce qui reste (cle, autre truc), soit tu n'affiches que les lignes "cle" et dans ce cas tu n'as pas besoin de te préoccuper des lignes "bidon" qui seront automatiquement exclues.

    papajoker ayant donné la solution "tout sauf bidon" et expliqué comment trouver l'autre "seules les lignes cle" en voici une autre pour afficher tout le fichier (quel qu'il soit) à partir de la première ligne "cle" : awk -F\; 'BEGIN {flag=0} {if ($0 ~ /^Cle/) flag=1; if (flag != 0) print $0}' fichier.csv.
    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. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 295

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    supprimer les n premières lignes d'un fichier, moins une ligne
    connais-tu le nombre de lignes à supprimer ?
    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
    finalement, que veux-tu faire ?!

    en conséquence, il faut adapter soit le titre du sujet, soit le contenu de ton message.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    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
    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

  7. #7
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    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 : 164
    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 ",$") ?

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

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

    Documentation : sed.zip

  9. #9
    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
    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.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    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]

  11. #11
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    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 : 164
    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.

  12. #12
    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
    Citation Envoyé par Liamm Voir le message
    Alors, comment [...] ne garder que les lignes clés dont on sait que cle0000001 est la première ?
    Pour ne garder que les lignes clés, et qui sont celles qui commencent par 'Cle', c'est tout simple avec grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep '^Cle' fichier.csv

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Citation Envoyé par jack-ft Voir le message
    Pour ne garder que les lignes clés, et qui sont celles qui commencent par 'Cle', c'est tout simple avec grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep '^Cle' fichier.csv
    La question n'est pas assez précise, car au vu du titre on peut être amener à penser que le but est de supprimer toutes les lignes avant celle qui commence par 'Cle' et si c'est le cas, ces 2 solutions ne fonctionnent pas car rien ne dit que le fichier ne contient que des lignes qui commencent par 'Cle' après la première ligne 'Cle' (d'où d'ailleurs la précision de Jack-ft sur sa solution).

  14. #14
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 295
    Par défaut
    C'est l'occasion de rappeler comment on fait un ET logique entre deux conditions avec sed.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '1,/^Cle0000001/[/^Cle/!d;}'

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    La question n'est pas assez précise, car au vu du titre on peut être amener à penser que le but est de supprimer toutes les lignes avant celle qui commence par 'Cle'
    C'est ce que j'ai pensé

    Citation Envoyé par disedorgue Voir le message
    et si c'est le cas, ces 2 solutions ne fonctionnent pas car rien ne dit que le fichier ne contient que des lignes qui commencent par 'Cle' après la première ligne 'Cle'
    La mienne prend en compte cete possibilité et fonctionne

    Citation Envoyé par Flodelarab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '1,/^Cle0000001/[/^Cle/!d;}'
    Ne connaissant pas le "et logique" du sed, j'ai voulu tester. Mais ça ne fonctionne pas chez-moi (sed 4.8 sur xubuntu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ sed '1,/^Cle0000001/[/^Cle/!d;}' a
    sed: -e expression n°1, caractère 16: commande inconnue: «*[*»
    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. #16
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 295
    Par défaut
    M'enfin. Tu vois bien qu'il y a une faute de frappe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '1,/^Cle0000001/{/^Cle/!d;}'

  17. #17
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    M'enfin. Tu vois bien qu'il y a une faute de frappe.
    M'enfin non, comme je l'ai dit, ne connaissant pas le "et logique" du sed, TA faute de frappe ne m'a pas sauté au visage !!!

    Sans déconner, ça arrive à tout le monde de se planter dans un code qu'on poste mais la moindre des choses c'est au-moins de ne pas venir en plus reprocher au lecteur d'avoir testé !!!
    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]

Discussions similaires

  1. Réponses: 8
    Dernier message: 01/12/2021, 18h42
  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, 09h31
  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, 14h39
  4. comment compiler avec la commande javac
    Par haksasse dans le forum Langage
    Réponses: 4
    Dernier message: 03/07/2007, 23h14
  5. Problème avec la commande sed
    Par JUSTIN Loïc dans le forum Linux
    Réponses: 2
    Dernier message: 05/09/2006, 10h17

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