remove linhas em branco no display awk

10

Eu estava tentando descobrir uma solução para esta pergunta. Eu queria usar awk para 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 comando awk para extrair os segundos valores depois de _ conforme abaixo.

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

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

Pergunta 1

Como posso remover as linhas em branco na saída para obter apenas venkat e venkat3 na saída?

Se eu usar printf em vez de print no meu awk , obtenho venkatvenkat3 como saída que não queria alcançar. Eu quero a saída como,

venkat
venkat3

Pergunta 2

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

Eu queria conseguir algo como

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

EDITAR

Eu não notei a solução awk de Stephane. Está fazendo a mesma coisa que eu mencionei?

    
por Ramesh 07.05.2014 / 17:27

4 respostas

9

Question1

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

Question2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3
    
por 07.05.2014 / 17:32
9

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

cut -s -f2 -d'_' file
venkat
venkat3
    
por 07.05.2014 / 17:33
8

Outra abordagem:

Pergunta 1

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

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

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

Questão 2

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

    
por 07.05.2014 / 18:55
7

pergunta 1

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

pergunta 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file
    
por 07.05.2014 / 17:29

Tags