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