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.
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
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'.
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
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
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
Cela pourrait fonctionner pour vous (GNU sed):
sed -n 'p;n' file # keep odd
sed -n 'n;p' file # keep even