web-dev-qa-db-fra.com

Comment supprimer chaque deuxième ligne d'un fichier?

Déposer:

Data inserted into table. Total count 13
No error occurred
Data inserted into table. Total count 45
No error occurred
Data inserted into table. Total count 14
No error occurred
Data inserted into table. Total count 90
No error occurred

Fichier de sortie attendu:

Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90

Je veux que la sortie ait l'air de cette façon: chaque deuxième ligne sera supprimée, mais il n'y aura pas d'espace entre les lignes.

25
pmaipmui

Avec sed:

sed -e n\;d <file

Avec POSIX awk:

awk 'FNR%2' <file

Si vous avez plus ancien awk (comme oawk), vous avez besoin de:

oawk 'NR%2 == 1' <file

Avec ex:

$ ex file <<\EX
:g/$/+d
:wq!
EX

éditera le fichier en place.

  • g marque une commande globale
  • /$/ correspondre à toutes les lignes
  • +d Supprimer la ligne suivante
  • wq! Enregistrer toutes les modifications

Cette approche partage le même idéal avec une approche sed, supprimez chaque prochain ligne de ligne actuelle de la ligne 1.

Avec Perl:

Perl -ne 'print if $. % 2' <file

et Perl6:

Perl6 -ne '.say if $*IN.ins % 2' <file
Perl6 -ne '.say if ++$ % 2' <file
36
cuonglm

Voici un moyen d'utiliser sed:

sed -n 'p;n' filename

Une autre façon avec GNU sed:

sed -n '1~2p' filename

Sortie des commandes ci-dessus:

Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90
5
serenesat

Vous pouvez essayer avec awk:

awk 'NR % 2 != 0' file

ou vous pouvez imprimer uniquement des lignes contenant Data inserted:

awk '$0 ~ /Data inserted/' file
4
taliezin

Une autre réponse, vous pourriez utiliser VI/Vim!

qdjdq

Et puis si votre fichier était de 500 lignes (par exemple) type

250 @ D

Puis pour écrire et quitter le type

:X

Ou si quelque chose ne va pas et que vous ne voulez pas économiser:

: Q!

Explication:

q      #Start Recording
 d     #Put the recording into register 'd'
  j    #Move the cursor down
   dd  #Delete the line
     q #Stop recording


250    #Number of repeats
   @d  #Playback the recording in register 'd'.
3
James

Voici une façon très différente de le faire:

< file paste - - | cut -f1

Cela suppose que les lignes numérotées impaires ne contiennent pas d'onglets. S'ils le font, vous devrez alors choisir un autre caractère de séparateur, par exemple. : ici:

< file paste -d: - - | cut -d: -f1
2
Digital Trauma

Une autre option (plus courte)

sed 'n; d' file
1
Michael Durrant

Cela résout également le problème, bien qu'il soit un peu plus lent:

vim -c "%normal jdd" -c "wq" file
0
FloriOn