¿Cómo eliminar cada segunda línea de un file?

Archivo:

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

Archivo de salida esperado:

 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 

Quiero que la salida se vea de esta manera: cada segunda línea se eliminará, pero no habrá espacio entre las líneas.

Con sed :

 sed -en\;d <file 

Con POSIX awk :

 awk 'FNR%2' <file 

Si tienes awk más viejo (como oawk ), necesitas:

 oawk 'NR%2 == 1' <file 

Con ex :

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

editará el file en el lugar.

  • g marque un command global
  • /$/ match cada línea
  • +d borra la siguiente línea
  • wq! save todos los cambios

Este enfoque comparte el mismo ideal con el enfoque sed , elimina cada línea siguiente del inicio de línea actual de la línea 1.

Con perl :

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

y perl6 :

 perl6 -ne '.say if $*IN.ins % 2' <file perl6 -ne '.say if ++$ % 2' <file 

Solucionar esto eliminando cada segunda línea puede ser propenso a errores (por ejemplo, cuando el process a veces genera dos líneas significativas en lugar de una). Puede ser que sea mejor filtrar la basura:

 grep -v "No error occurnetworking" file 

Se puede ejecutar como filter, puede agregar más patrones de basura aquí y mejorar el resultado.

Como respuesta a la pregunta, con GNU sed :

 sed '0~2d' file 

eliminará cada segunda línea pero me gustaría ofrecer líneas de filter por su contenido:

 sed '/Data/! d' file 

o con el mismo resultado

 sed '/No error/d' file 

Aquí hay una forma de usar sed :

 sed -n 'p;n' filename 

Otra forma con GNU sed :

 sed -n '1~2p' filename 

Salida de los commands anteriores:

 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 

Puedes probar con awk :

 awk 'NR % 2 != 0' file 

o puede imprimir solo líneas que contengan Data inserted :

 awk '$0 ~ /Data inserted/' file 

Otra respuesta, podrías usar vi / vim!

qdjddq

Y luego, si su file era de 500 líneas (por ejemplo), escriba

250 @ d

Y luego para escribir y salir del tipo

:X

O si algo sale mal y no quieres save:

: q!

Explicación:

 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'. 

Aquí hay una forma bastante diferente de hacerlo:

 < file paste - - | cut -f1 

Esto supone que las líneas impares no contienen tabs. Si lo hacen, tendrás que elegir otro carácter de separación, por ejemplo : aquí:

 < file paste -d: - - | cut -d: -f1 

Otra opción (más corta)

 sed 'n; d' file 

También resuelve el problema, aunque es un poco más lento:

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