Esto podría funcionar para usted (tanto GNU como no GNU sed):
sed -n 'p;n' file # keep odd
sed -n 'n;p' file # keep even
-n
:suprimir impresión
p
:imprime la línea actual
n
:línea siguiente
Usando GNU sed:
sed -i '0~2d' filename
para eliminar las líneas pares del archivo.
Para eliminar líneas impares:
sed -i '1~2d' filename
El -i
La opción haría que los cambios se guardaran en el archivo en el lugar.
Citando del manual:
`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'.
wow
Los %
es un operador de módulo y NR
es el número de línea actual, entonces NR%2==0
es cierto solo para líneas pares e invocará la regla predeterminada para ellas ({ print $0 }
). Por lo tanto, para guardar solo las líneas pares , redirige la salida desde awk
a un nuevo archivo:
awk 'NR%2==0' infile > outfile
sed
Puedes lograr lo mismo con sed
. devnulls respuesta muestra cómo hacerlo con GNU sed
.Abajo hay alternativas para las versiones de sed
que no tienen el ~
operador:
mantener líneas impares
sed 'n; d' infile > outfile
mantener líneas uniformes
sed '1d; n; d' infile > outfile