eliminar líneas en blanco en la pantalla awk

10

Estaba tratando de encontrar una solución para esta pregunta. Quería usar awkpara la solución.

Mi archivo de entrada es algo como a continuación.

-bash-3.2$ cat file
ramesh
ramesh_venkat
ramesh3_venkat3
ramesh4
ramesh5
venkat
venkat3
venkat4

Usé el awkcomando para extraer los segundos valores después de _lo siguiente.

awk -F "_" '{print $2}' file

Sin embargo, aunque el comando anterior imprime los valores correctos, obtengo líneas en blanco en mi salida. Tengo 2 preguntas

Pregunta 1

¿Cómo puedo eliminar las líneas en blanco en la salida para obtener solo venkaty venkat3en la salida?

Si lo uso en printflugar de printen mi awk, obtengo venkatvenkat3como resultado lo que no es lo que quería lograr. Quiero la salida como

venkat
venkat3

Pregunta 2

Usando esos valores como una matriz asociativa o algo así, ¿cómo puedo encontrar si los valores realmente ocurren en la $1columna?

Quería lograr algo como,

awk -F "_" '$2==1{print $1}' file

EDITAR

No noté la awksolución de Stephane. ¿Está haciendo lo mismo que había mencionado?

Ramesh
fuente
1
Stephane awkno está haciendo lo mismo. Su enfoque supone que una palabra solo puede estar contenida en otra si está separada por _. Si bien eso es cierto para el ejemplo del OP, todas las respuestas publicadas también tratan casos como dogliony no solo dog_lion.
terdon

Respuestas:

8

Pregunta 1

$ awk -F _ 'NF > 1 {print $2}' file
venkat
venkat3

Pregunta 2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3
Cuonglm
fuente
Necesito mostrar venkaty venkat3según el OP formulado en la otra pregunta. Estoy tratando de encontrar si la clave posterior _está presente en mi $1columna.
Ramesh
¡Oh, he actualizado mi respuesta!
Cuonglm
Buena solución Creo que deberías agregar este también a tu solución en la otra pregunta :)
Ramesh
8

para la pregunta 1, puede usar la opción --only-delimited( -s) decut

cut -s -f2 -d'_' file
venkat
venkat3
iruvar
fuente
8

Otro enfoque:

Pregunta 1

awk -F_ '$2{print $2}' file

Esto solo se imprimirá si $2está definido. Es una forma más corta de escribir:

awk -F_ '{if($2){print $2}}' file

Pregunta 2

No tengo nada que agregar que aún no se haya abordado.

terdon
fuente
1
Buena solución para la pregunta 1. Corto y crujiente :)
Ramesh
6

Pregunta 1

awk -F "_" '/_/ {print $2}' file

Pregunta 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file
Hauke ​​Laging
fuente
Buena solución Me gusta :)
Ramesh
Para la pregunta 2, tengo la intención de obtener solo venkaty venkat3como salida ya que están presentes $1. Sin embargo, obtengo todos los $1valores según su comando.
Ramesh
@Ramesh: Como su descripción, creo que desea obtener la $2entrada que se ha $2producido en la primera columna. ¿Es esto correcto?
Cuonglm
@Gnouc, sí, tienes razón.
Ramesh