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. #1
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    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 : 160
    Points : 80
    Points
    80
    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 101
    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 101
    Points : 4 446
    Points
    4 446
    Par défaut
    bonjour

    Pour faire ton filtre, tu peux utiliser simplement grep ... grep -vi bidon (ou l'inverse)
    $moi= ( !== ) ? : ;

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    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 éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    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 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 [...] 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

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 722
    Points
    12 722
    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).
    Cordialement.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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;}'
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    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]

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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;}'
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    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]

  12. #12
    Membre confirmé
    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
    Points : 460
    Points
    460
    Par défaut
    Bonjour

    @Flodelarab
    Si je pige bien, tu lui dis de travailler de la la ligne 1 à la 1ere ligne commençant pas cle et d'exclure la ligne commençant par cle ?
    Sous Kubuntu 20.04

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    entre celui qui ne sait pas écrire, et celui qui "ne sait pas lire", vous allez tous les deux gentiment vous ranger au coin !


    pour l'instant, qui poste du code le fait au risque de devoir revoir sa copie quand Liamm aura explicité son besoin.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Personnellement, je ne me sens pas attaché au travail de Liamm. On donne des idées, et on décoince. Une idée, avec sed, dont on n'a pas parlé :
    @hizoka: oui
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Personnellement, je ne me sens pas attaché au travail de Liamm. On donne des idées, et on décoince. Une idée, avec sed, dont on n'a pas parlé :
    @hizoka: oui
    Euh, perso, plus sur c'est '/Cle/,$p'.

    Pour rappel, ici le '$' (dans l'adressage de sed) représente la dernière ligne, donc on est sur un adressage du type: ligne contenant 'Cle' jusqu' à dernière ligne du dernier fichier.
    Cordialement.

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    plus sur c'est...
    Ben tu sais pas réellement ce qu'a voulu montrer Flodelarab qui propose une solution sans dire son but. Moi j'ai testé son code (encore), et ça m'a donné toutes les lignes "Cle" (mon fichier d'exemple reprend le fichier d'origine auxquelles j'ai rajouté des lignes persos). A partir de là je me suis dit "ok il a voulu faire un simple grep" sans autre "à priori" et là encore sans penser à une éventuelle faute de frappe (je fais trop confiance aux autres moi !!!).

    Ceci dit, ton code lui donne toutes les lignes quelles qu'elles soient à partir de la première "Cle". Comme celui que j'avais écrit en bien plus simple (j'ai pas le réflexe d'utiliser des commandes "ed" dans "sed" alors que je sais très bien que les deux ont le même coeur )
    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]

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Ben tu sais pas réellement ce qu'a voulu montrer Flodelarab
    Tout est politique, vous le savez bien. Il existe principalement 2 politiques de sécurité "Permettre tout sauf..." et "Interdire tout, sauf...". Exemple : pour protéger ses enfants sur internet, on peut exclure tous les sites, sauf Disney, Vikidia, etc. Mais on peut aussi tout autoriser sauf les sites pornos, violents, illégaux, etc.

    Si on utilise sed comme un filtre, on peut faire la version positive ou la version négative. J'ai montré "sed -n" (on n'affiche rien), sauf .... (commande p).
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  18. #18
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    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 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben tu sais pas réellement ce qu'a voulu montrer Flodelarab qui propose une solution sans dire son but. Moi j'ai testé son code (encore), et ça m'a donné toutes les lignes "Cle" (mon fichier d'exemple reprend le fichier d'origine auxquelles j'ai rajouté des lignes persos). A partir de là je me suis dit "ok il a voulu faire un simple grep" sans autre "à priori" et là encore sans penser à une éventuelle faute de frappe (je fais trop confiance aux autres moi !!!).

    Ceci dit, ton code lui donne toutes les lignes quelles qu'elles soient à partir de la première "Cle". Comme celui que j'avais écrit en bien plus simple (j'ai pas le réflexe d'utiliser des commandes "ed" dans "sed" alors que je sais très bien que les deux ont le même coeur )
    Une spéciale awk simple aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/Cle/ {x=1}x' fichier
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    je ne suis pas sûr de la nécessité de {x=1}x
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    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 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je ne suis pas sûr de la nécessité de {x=1}x
    Ben sans ça ça ne marche pas. Moi non plus je ne pige pas ce que ça fait concrètement mais si j'enlève {x=1} j'obtiens tout. Si j'enlève le "x" final je n'ai rien et de même si je remplace {x=1} par {x=0}. Mais si je remplace {x=1} par {x=123} j'obtiens le même résultat (ça doit-être un booléen).
    Ainsi si on écrit plus littéralement awk '/Cle/{x=1} {if (x) print $0}' fichier ça fait la même chose. L'écriture brillante de disedorgue doit en être un raccourci...

    PS: je pars du principe que le code doit afficher toutes les lignes à partir de la première "cle" (et non pas simplement les lignes "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]

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