web-dev-qa-db-fra.com

Supprimer les lignes paires ou impaires d'un fichier texte

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

awk 'NR%2==0' file

mais il imprime uniquement les lignes impaires dans le terminal. Comment vraiment les supprimer?

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

36
SamuelNLP

awk

Le % est un opérateur de module et NR est le numéro de ligne actuel, donc NR%2==0 n'est vrai que pour les lignes paires et invoquera la règle par défaut pour elles ({ print $0 }). Ainsi, pour enregistrer uniquement les lignes paires , redirigez la sortie de awk vers 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. Vous trouverez ci-dessous des alternatives pour les versions de sed qui n'ont pas le ~ opérateur:

garder les lignes impaires

sed 'n; d' infile > outfile

garder les lignes paires

sed '1d; n; d' infile > outfile
72
Thor

Utilisation de GNU sed:

sed -i '0~2d' filename

pour supprimer les lignes paires du fichier.

Pour supprimer les lignes impaires:

sed -i '1~2d' filename

L'option -i Entraînerait l'enregistrement des modifications dans le fichier sur place.

Citant 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'.
13
devnull

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

awk '!(NR%2)' file

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

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

ou revenir à l'original:

awk '!(NR%2)' file > newfile && mv newfile file
5
Ed Morton

Cela pourrait fonctionner pour vous (GNU sed):

 sed -n 'p;n' file # keep odd
 sed -n 'n;p' file # keep even
3
potong

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

awk '{ if (NR%2) print > "odd.txt"; else print > "even.txt" }' input.txt
3
twalberg

Solution Perl pour l'impression uniforme sur un nouveau fichier:

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

Pour imprimer les cotes, modifiez == 1 à == 0

$. est le numéro de ligne

Conserve uniquement les données identiques dans le fichier d'origine:

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

Comme ci-dessus, mais crée un fichier de sauvegarde appelé infile.bak:

Perl -i.bak -lne 'print if $. % 2 == 0' infile
1
Chris Koknat