2010-04-01 33 views
29

¿Cómo puedo eliminar cada línea impar, usando sed?¿Cómo eliminar cada otra línea con sed?

remove 
keep 
remove 
keep 
remove 
... 
+0

La mitad de las preguntas de esta mañana parece ser inocentes chistes, así ... – Will

+0

Si se trata de los Inocentes de, a continuación, la respuesta debe ser: grEP No input.txt – paxdiablo

+0

@paxdiablo: Pero ¿qué pasa con 'grep -v Remove'? – Cascabel

Respuesta

51

GNU SED tiene un modo adecuado direccionamiento:

sed -n '1~2!p' file 

lo que significa, a partir de la línea 1, y con el paso 2, imprimir todas las otras líneas.

De manera equivalente, se puede eliminar la -n, y borrar las líneas que coincidan:

sed '1~2d' 

También se puede hacer uso de awk:

awk 'NR%2==0' file 

(Siempre que el número de línea es un múltiplo de 2, imprimir la línea)

+0

¡Gracias por esto! muy útil. –

+1

Aparece el error "código de comando inválido ~" cuando pruebo esto con sed on macos. –

31

Aquí está lo más corto que se me ocurre:

sed -n 'g;n;p' file 

Se debe trabajar con versiones no GNU de sed (así como GNU sed).

+4

+1 para portabilidad –

+3

¡Esto también funciona en OS X! (A diferencia de 'sed -n '1 ~ 2! P''.) Toma las líneas 2,4,6, ... No pude deducir de la página del manual cómo tomar las líneas 1,3,5, .. Sin embargo, agregar una primera línea es un truco simple. – Nagel

+7

@Nagel: Pruebe: 'sed -n 'p; n' file' o' sed 'n; d' file' para generar las líneas impares. Por cierto, no creo que la 'g' sea necesaria para generar las líneas pares:' sed -n 'n; p' file' parece funcionar. –

3

solución Perl:

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

$. es el número de línea

+0

El chico pidió 'sed', que muestra las habilidades de lectura pobres de su parte, pero alguien podría resultar útil, por lo que 1. –

+1

Respondí porque sed, awk y perl a menudo se pueden usar indistintamente. Si bien existen diferencias en cuanto a velocidad y simplicidad, todas se usan en la línea de comando o dentro de las secuencias de comandos de la shell. –

Cuestiones relacionadas