¿Cómo puedo hacer que awk imprima tanto coincidencias como no coincidencias?

¿Cómo puedo hacer que awk imprima tanto coincidencias como no coincidencias?

Básicamente, todo lo que quiero hacer es modificar las salidas si la entrada coincide con un filtro, pero la parte que se modifica no es la que se filtra (o yo usaría sed). El problema hasta ahora es que mi awksolo genera las líneas modificadas.

Ejemplo rápido, ponga esto en test.txt:

orange beet pear cowmilk
apple pear berry cowmilk
orange melon cherry cowmilk

Si uso el código:

awk /orange/'{gsub(/cow/,"cow~"); print}' test.txt

Yo obtengo:

orange beet pear cow~milk
orange melon cherry cow~milk

Cuando preferiría obtener:

orange beet pear cow~milk
apple pear berry cowmilk
orange melon cherry cow~milk

Veo que te sirve ||awk, pero no he podido descubrir cómo hacer que encaje con el gsub anterior.

Para una apreciación adicional, lo que realmente me gustaría hacer es agregar color en lugar de ~, pero eso se rompe por completo, es decir

awk /orange/'{gsub(/cow/,"cow'\e[1;34m'"); print}' test.txt

me da un error por \no ser el final de la línea.

Respuesta1

Para el color, debe especificar el carácter ESC real (no la forma de escape \e). El valor es hexadecimal \x1Bu octal \033. Los siguientes scripts colorean el guión -e imprimen todas las líneas de entrada.

awk '/orange/{gsub(/cowmilk/,"cow\x1B[1;34m-\x1B[0mmilk")} {print}' "$file"

sed '/orange/{s/cowmilk/cow\x1B[1;34m-\x1B[0mmilk/g}' "$file"

Respuesta2

Para imprimir cada línea después de modificar solo algunas, agregue una condición separada que siempre se evalúe como verdadera, como ( 1):

awk '/orange/{gsub("cow", "cow~")} 1' "$file"

También podrías tener {print}explícitamente:

awk '/orange/{gsub("cow", "cow~")} {print}' "$file"

Recuerde que cada declaración awk consta de una condición y una cláusula de declaración:

condition {statements}

Pero cada uno de estos es opcional, si no incluye{statements}, entonces {print}se utiliza. Si no incluyescondition, entonces 1se utiliza.

información relacionada