Estaba tratando de encontrar una solución paraestepregunta. Quería usar awk
para la solución.
Mi archivo de entrada es algo como el siguiente.
-bash-3.2$ cat file
ramesh
ramesh_venkat
ramesh3_venkat3
ramesh4
ramesh5
venkat
venkat3
venkat4
Utilicé awk
el comando para extraer los segundos valores después _
como se muestra a continuación.
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 el resultado para obtener solo venkat
y venkat3
en el resultado?
Si lo uso printf
en lugar de print
en mi awk
, obtengo venkatvenkat3
un resultado que no quería lograr. Quiero el resultado como,
venkat
venkat3
Pregunta 2
Utilizando esos valores comomatriz asociativao algo así, ¿cómo puedo saber si los valores realmente aparecen en $1
la columna?
Quería lograr algo como,
awk -F "_" '$2==1{print $1}' file
EDITAR
No noté la awk
solución de Stéphane. ¿Está haciendo lo mismo que había mencionado?
Respuesta1
Otro enfoque:
Pregunta 1
awk -F_ '$2{print $2}' file
Esto sólo se imprimirá si $2
está definido. Es una forma más corta de escribir:
awk -F_ '{if($2){print $2}}' file
Pregunta 2
No tengo nada que agregar que no se haya abordado ya.
Respuesta2
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
Respuesta3
para la Pregunta 1, puede utilizar la opción --only-delimited
( ) de-s
cut
cut -s -f2 -d'_' file
venkat
venkat3
Respuesta4
Pregunta 1
awk -F "_" '/_/ {print $2}' file
Pregunta 2
awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file