Supprimer les lignes impaires ou paires d'un fichier texte

j'ai besoin de supprimer des lignes impaires dans un fichier texte pour faire un sous-échantillonnage. J'ai trouvé cette commande,

awk 'NR%2==0' file

mais il n'imprime que les lignes impaires dans le terminal. Comment les supprimer?

Je ne me soucie pas vraiment de pair ou impair, je veux qu'ils soient retirés du fichier ou imprimés dans un autre fichier. Ça ne les imprime que dans le terminal.

30
demandé sur codeforester 2014-01-23 17:03:44

6 réponses

awk

% est un opérateur de modulo et NR est le numéro de ligne courant, donc NR%2==0 est vraie que pour les lignes paires et invoquer la règle par défaut ({ print }). Donc enregistrer uniquement les lignes, redirigez la sortie de awk dans un nouveau fichier:

awk 'NR%2==0' infile > outfile

sed

Vous pouvez accomplir la même chose avec sed. devnulls réponse montre comment le faire avec GNU sed. Dessous sont des alternatives pour les versions de sed qui n'ont pas l' ~ opérateur:

garder les lignes impaires

sed 'n; d' infile > outfile

garder les même lignes

sed '1d; n; d' infile > outfile
60
répondu Thor 2017-05-23 11:54:46

utilisation de GNU sed:

sed -i '0~2d' filename

pour supprimer les lignes pairs numérotées du fichier.

pour supprimer les lignes impaires numérotées:

sed -i '1~2d' filename

-i l'option permettrait de sauvegarder les modifications dans le fichier en place.

citation tirée du manuel:

`FIRST~STEP'
     This GNU extension matches every STEPth line starting with line
     FIRST.  In particular, lines will be selected when there exists a
     non-negative N such that the current line-number equals FIRST + (N
     * STEP).  Thus, to select the odd-numbered lines, one would use
     `1~2'; to pick every third line starting with the second, `2~3'
     would be used; to pick every fifth line starting with the tenth,
     use `10~5'; and `50~0' is just an obscure way of saying `50'.
10
répondu devnull 2016-07-06 11:39:35

ne vous concentrez pas sur le négatif (suppression des lignes), concentrez-vous sur le positif (sélection des lignes) et votre solution suivra. Ainsi, au lieu de I need to remove odd lines vous devriez penser I need to select even lines et puis la solution est simple:

awk '!(NR%2)' file

Si vous souhaitez sauvegarder le résultat dans un nouveau fichier:

awk '!(NR%2)' file > newfile

ou de l'arrière à l'original:

awk '!(NR%2)' file > newfile && mv newfile file
5
répondu Ed Morton 2014-01-23 18:57:57

Voici un awk exemple pour créer deux nouveaux fichiers contenant respectivement les lignes impaire et pair:

awk '{ if (NR%2) print > "odd.txt"; else print > "even.txt" }' input.txt
3
répondu twalberg 2014-01-23 20:11:22

Perl solution pour l'impression de evens à nouveau fichier:

perl -lne 'print if $. % 2 == 0' infile > outfile

Pour imprimer la cote, changement == 1== 0

$. est le numéro de la ligne

conserve seulement evens dans le fichier original:

perl -i -lne 'print if $. % 2 == 0' infile

idem que ci-dessus, mais fait un fichier de sauvegarde appelé infile.bak:

perl -i.bak -lne 'print if $. % 2 == 0' infile
1
répondu Chris Koknat 2015-09-15 18:32:28

Cela pourrait fonctionner pour vous (GNU sed):

 sed -n 'p;n' file # keep odd
 sed -n 'n;p' file # keep even
1
répondu potong 2018-02-20 09:53:52