Eliminar líneas donde alguna de las columnas esté vacía

Eliminar líneas donde alguna de las columnas esté vacía

Tengo un archivo de texto grande delimitado por dos puntos que contiene dos columnas como esta:

valueA:valueB
valueC:
valueD:valueE
:valueG

Si no hay datos a la izquierdaoa la derecha de los dos puntos, quiero eliminar toda la línea:

valueA:valueB
valueD:valueE

¿Cómo haría para hacer esto?

Lo más cercano que tengo es algo como:

awk -F : '$2!=""' file > final_output

Pero esto parece coincidir con todo, independientemente de si la línea contiene una columna vacía o no.

Respuesta1

Su awkcomando mantiene correctamente líneas de ejemplo valueA:valueBy valueD:valueEelimina la valueC:línea (por lo tanto, no estoy seguro de lo que quiere decir con "parece coincidirtodo").

El comando se mantiene :valueGporque no prueba el primer campo en absoluto.

"No imprima líneas donde alguna de las dos columnas esté vacía" se puede codificar awkcomo:

awk -F : '! ( $1=="" || $2=="" )'

La tarea es equivalente a "imprimir sólo líneas donde cada columna no esté vacía":

awk -F : '$1!="" && $2!=""'

Note awkes una herramienta muy adecuada para abordar el problema. Nuestras dos líneas reflejan la lógica deseada en términos de "delimitador" ( -F :), "columnas"/"campos" ( $1, $2) "estar vacíos" ( …==""), etc. Puede haber soluciones con otras herramientas, pero su funcionamiento no necesariamente expresará la lógica tan claramente. Por ejemplo con grep:

grep '.:.'

El comando anterior funciona bien y es más simple que los awkanteriores. Sin embargo, su forma no refleja directamente la esencia del problema. Si bien su minimalismo me agrada estéticamente, sigo pensando que awkes lo correcto.

Respuesta2

Con sed y tres scomandos:

sed 'N; s/\n:/:/; s/\n/:/; s/:$//' file

Producción:

valorA:valorB:valorC
valorD:valorE:valorG

De man sed:

N: agregue la siguiente línea de entrada al espacio del patrón

información relacionada