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 awk
comando mantiene correctamente líneas de ejemplo valueA:valueB
y valueD:valueE
elimina la valueC:
línea (por lo tanto, no estoy seguro de lo que quiere decir con "parece coincidirtodo").
El comando se mantiene :valueG
porque no prueba el primer campo en absoluto.
"No imprima líneas donde alguna de las dos columnas esté vacía" se puede codificar awk
como:
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 awk
es 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 awk
anteriores. Sin embargo, su forma no refleja directamente la esencia del problema. Si bien su minimalismo me agrada estéticamente, sigo pensando que awk
es lo correcto.
Respuesta2
Con sed y tres s
comandos:
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