Questo potrebbe funzionare per te (sia GNU che non GNU sed):
sed -n 'p;n' file # keep odd
sed -n 'n;p' file # keep even
-n
:elimina la stampa
p
:stampa la riga corrente
n
:riga successiva
Utilizzo di GNU sed:
sed -i '0~2d' filename
per rimuovere le righe pari dal file.
Per rimuovere le righe dispari:
sed -i '1~2d' filename
Il -i
l'opzione farebbe sì che le modifiche vengano salvate sul posto nel file.
Citando dal manuale:
`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'.
awk
Il %
è un operatore modulo e NR
è il numero di riga corrente, quindi NR%2==0
è vero solo per le righe pari e invocherà la regola predefinita per esse ({ print $0 }
). Quindi per salvare solo le linee pari , reindirizza l'output da awk
in un nuovo file:
awk 'NR%2==0' infile > outfile
sed
Puoi ottenere la stessa cosa con sed
. devnulls answer mostra come farlo con GNU sed
.Di seguito sono riportate le alternative per le versioni di sed
che non hanno il ~
operatore:
mantieni linee dispari
sed 'n; d' infile > outfile
mantieni linee pari
sed '1d; n; d' infile > outfile