Suppression de m lignes modulo 2m avec Sed

Résolu
huitsept Messages postés 3 Statut Membre -  
huitsept Messages postés 3 Statut Membre -
Bonjour,
j'ai un fichier dans lequel je souhaite supprimer les m premières lignes, garder les m suivantes, supprimer ensuite m lignes, garder les m suivantes, etc. Avec m un entier grand.

Je connais les commandes :
sed '1~1000d'
pour supprimer toutes les lignes modulo 1000
et
sed 'n;d'
pour supprimer une ligne sur deux,

mais cela ne répond pas à mon souhait (m est grand de sorte que sed 'n;n;n...;n;d;d;d...;d' n'est pas envisageable).

Merci pour toute réponse (je peux aussi utiliser un autre programme que Sed pour réaliser cette opération).

Alexis

4 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    essayer
    m=8192; awk -v m=$m '!((NR-1)%m) {n=!n} !n' fichier
    
    2
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Salut,

      <ModeLeCompteEstBonON>
      Pas mieux ;-)
      <ModeLeCompteEstBonOFF>
      0
    2. huitsept Messages postés 3 Statut Membre
       
      Merci beaucoup zipe31 et dubcek pour vos réponses.
      Les deux fonctionnent (avec l'option -a4 avec split pour permettre des suffixes de longueur 4) et permettent de résoudre mon problème.
      0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Il a combien de lignes ton fichier ?
    C'est quoi la valeur de "m" ?

    J'ai peut être une solution, mais ça dépend fortement des 2 réponses précédentes.
    Ce n'est peut être pas l'idéal mais faute de mieux...
    0
  3. huitsept Messages postés 3 Statut Membre
     
    Bonjour et merci de ton intérêt pour ma question.
    Pour le fichier qui m'intéresse, la valeur de m est de 8192 et le fichier a une taille de l'ordre du Go (le nombre de lignes est un multiple de 8192).
    0
  4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Bon voilà mon raisonnement...

    Un fichier (plop) contenant 30000 lignes comme suit :
    $ cat plop 
    Ligne 1
    Ligne 2
    Ligne 3
    Ligne 4
    Ligne 5
    ...
    Ligne 29995
    Ligne 29996
    Ligne 29997
    Ligne 29998
    Ligne 29999
    Ligne 30000
    


    Je découpe ce fichier en 30 fichiers de 1000 lignes chacun avec la commande split (l'option "-d" sert à produire des fichiers numérotés de x00 à x29) :
    $ split -d -l1000 plop 


    Ce qui me donne donc :
    $ ls
    plop  x01  x03  x05  x07  x09  x11  x13  x15  x17  x19  x21  x23  x25  x27  x29
    x00   x02  x04  x06  x08  x10  x12  x14  x16  x18  x20  x22  x24  x26  x28


    Il ne me reste plus qu'à concaténer les fichiers impairs dans un fichier final :
    $ cat *[13579] > final


    $ less final 
    Ligne 1001
    Ligne 1002
    Ligne 1003
    Ligne 1004
    Ligne 1005
    Ligne 1006
    Ligne 1007
    Ligne 1008
    Ligne 1009
    Ligne 1010
    ...
    Ligne 1995
    Ligne 1996
    Ligne 1997
    Ligne 1998
    Ligne 1999
    Ligne 2000
    Ligne 3001
    Ligne 3002
    Ligne 3003
    Ligne 3004
    Ligne 3005
    ...
    Ligne 27995
    Ligne 27996
    Ligne 27997
    Ligne 27998
    Ligne 27999
    Ligne 28000
    Ligne 29001
    Ligne 29002
    Ligne 29003
    Ligne 29004
    Ligne 29005
    ...
    Ligne 29995
    Ligne 29996
    Ligne 29997
    Ligne 29998
    Ligne 29999
    Ligne 30000
    $

    0