web-dev-qa-db-fra.com

Comment supprimer toutes les autres lignes avec sed?

Comment supprimer toutes les lignes impaires en utilisant sed?

remove
keep
remove
keep
remove
...
39
hhh

GNU sed a un mode d'adressage approprié:

sed -n '1~2!p' file

ce qui signifie qu'à partir de la ligne 1 et à l'étape 2, imprimez toutes les autres lignes.

De manière équivalente, vous pouvez supprimer le -n, et supprimez les lignes correspondantes:

sed '1~2d'

Cela peut également être fait en utilisant awk:

awk 'NR%2==0' file

(Chaque fois que le numéro de ligne est un multiple de 2, imprimez la ligne)

67
ghostdog74

Voici le plus court auquel je puisse penser:

sed -n 'g;n;p' file

Il devrait fonctionner avec les versions non GNU de sed (ainsi que GNU sed).

36

Cela fonctionne avec les versions GNU et BSD (mac) de sed:

Pour supprimer les lignes impaires (imprimer les lignes paires):

sed -n ’n;p’ file

Cela peut sembler un peu déroutant, alors voici ce qui se passe sous le capot étape par étape:

  1. sed: lit en première ligne
  2. -n: supprime la sortie de la première ligne
  3. n: la sortie est supprimée, donc n’écrivez rien
  4. n (encore): lire la (deuxième) ligne suivante dans le tampon de modèle, c'est-à-dire traiter immédiatement
  5. p: imprime tout ce qui est disponible dans le tampon de motif et remplace la sortie supprimée, c'est-à-dire la 2e ligne
  6. sed: lit en troisième ligne, car la deuxième ligne a déjà été traitée grâce à "n" à l'étape 4
  7. -n: supprime la sortie de la troisième ligne
  8. ...
  9. ...

Pour supprimer les lignes paires (imprimer les lignes impaires):

sed -n ‘p;n’ file

Voici ce qui se passe sous le capot algorithmiquement:

  1. sed: lit en première ligne
  2. -n: supprime la sortie de la première ligne
  3. p: imprime le contenu du tampon de motif, c'est-à-dire la première ligne, remplaçant la sortie supprimée
  4. n: la sortie est supprimée, donc n’écrivez rien
  5. n (encore): lu dans la (deuxième) ligne suivante vers le tampon de modèle pour un traitement immédiat, mais comme il n'y a plus de commandes, rien ne se passe
  6. sed: lit en troisième ligne, car la deuxième ligne a déjà été "traitée" grâce à "n" à l'étape 5
  7. -n: supprime la sortie de la troisième ligne
  8. p: imprime la troisième ligne remplaçant la sortie supprimée
  9. ...
5
balanyo

Solution Perl:

Perl -ne 'print if $. % 2 == 0' file

$. est le numéro de ligne

4
Chris Koknat

Encore un awk:

awk getline file
2
Scrutinizer