Suppression de m lignes modulo 2m avec Sed

Résolu
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. Contributeur
    hello
    essayer
    m=8192; awk -v m=$m '!((NR-1)%m) {n=!n} !n' fichier
    
    2
    1. Contributeur
      Salut,

      <ModeLeCompteEstBonON>
      Pas mieux ;-)
      <ModeLeCompteEstBonOFF>
      0
    2. 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. Contributeur
    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
    1. 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
      1. Contributeur
        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