remover linhas em branco na exibição do awk

10

Eu estava tentando descobrir uma solução para esta pergunta. Eu queria usar awkpara a solução.

Meu arquivo de entrada é algo como abaixo.

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

Eu usei o awkcomando para extrair os segundos valores depois _como abaixo.

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

No entanto, embora o comando acima imprima os valores corretos, estou recebendo linhas em branco na minha saída. Eu tenho 2 perguntas.

Questão 1

Como posso remover as linhas em branco na saída para obter apenas venkate venkat3na saída?

Se eu usar em printfvez de printno meu awk, recebo venkatvenkat3o resultado que não é o que eu queria alcançar. Eu quero a saída como,

venkat
venkat3

Questão 2

Usando esses valores como uma matriz associativa ou algo assim, como posso descobrir se os valores realmente ocorrem na $1coluna?

Eu queria alcançar algo como,

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

EDITAR

Não notei a awksolução de Stephane. Está fazendo a mesma coisa que eu mencionei?

Ramesh
fonte
1
Stephane's awknão está fazendo a mesma coisa. Sua abordagem assume que uma palavra só pode estar contida em outra se for separada por _. Embora isso seja verdade no exemplo do OP, todas as respostas postadas também lidam com casos como doglione não apenas dog_lion.
terdon
Para não-awk, consulte: Como remover linhas em branco de um arquivo no shell?
Kenorb 5/05

Respostas:

8

Questão 1

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

Questão 2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3
cuonglm
fonte
Eu preciso exibir venkate de venkat3acordo com o OP solicitado na outra pergunta. Estou tentando descobrir se a chave depois _está presente na minha $1coluna.
Ramesh
Atualizei minha resposta!
cuonglm
Ótima solução. Eu acho que você deve adicionar um presente também para a sua solução na outra pergunta :)
Ramesh
8

para a pergunta 1, você pode usar a opção --only-delimited( -s) decut

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

Outra abordagem:

Questão 1

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

Isso será impresso apenas se $2estiver definido. É uma maneira mais curta de escrever:

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

Questão 2

Não há nada a acrescentar que ainda não tenha sido abordado.

terdon
fonte
1
Boa solução para a pergunta Curto e nítido :)
Ramesh
6

questão 1

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

Questão 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file
Hauke ​​Laging
fonte
Ótima solução. I like it :)
Ramesh
Para a questão2, pretendo obter apenas venkate venkat3como saída, como eles estão presentes $1. No entanto, recebo todos os $1valores conforme seu comando.
Ramesh
@ Jamesh: Como sua descrição, acho que você deseja obter a $2entrada que ocorreu $2na 1ª coluna. Isto está certo?
cuonglm
@ Gnouc, sim, você está certo.
Ramesh