Suppression de m lignes modulo 2m avec Sed

Résolu/Fermé
huitsept Messages postés 3 Date d'inscription vendredi 31 mai 2013 Statut Membre Dernière intervention 1 juin 2013 - 31 mai 2013 à 15:54
huitsept Messages postés 3 Date d'inscription vendredi 31 mai 2013 Statut Membre Dernière intervention 1 juin 2013 - 1 juin 2013 à 12:27
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

A voir également:

4 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
1 juin 2013 à 09:02
hello
essayer
m=8192; awk -v m=$m '!((NR-1)%m) {n=!n} !n' fichier
2
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
1 juin 2013 à 09:56
Salut,

<ModeLeCompteEstBonON>
Pas mieux ;-)
<ModeLeCompteEstBonOFF>
0
huitsept Messages postés 3 Date d'inscription vendredi 31 mai 2013 Statut Membre Dernière intervention 1 juin 2013
1 juin 2013 à 12:27
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
31 mai 2013 à 18:01
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
huitsept Messages postés 3 Date d'inscription vendredi 31 mai 2013 Statut Membre Dernière intervention 1 juin 2013
31 mai 2013 à 18:22
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
31 mai 2013 à 18:46
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