shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Explicação com Comando AWK


From: Tiago Peczenyj
Subject: Re: [shell-script] Explicação com Comando AWK
Date: Tue, 14 Apr 2015 16:27:59 +0200

vamos la

vc tem dois comandos:

FNR==NR {a[$2]=$3;next}
{print $0,a[$2]?a[$2]:"NA"}
o primeiro tem uma mutreta do FNR == NR junto com next, basicamente diz ( no primeiro arquivo faça isso )

isso no caso é guardar no hash a o par: chave $2 e valor $3

o segundo bloco vai ser executado, graças a mutreta anterior, só no segundo arquivo. basicamente vc procura saber se existe a chave $2 no hash a e se sim, imprime o valor, caso contrario imprime NA.

no caso vc quer que nas linhas que tenham rs1 vc adicione Pascal na ultima linha, e nas linhas com rs4 vc quer Albinomi, caso contrario NA

qual é a mutreta do FNR == NR ?

NR é o numero do registro que o AWK esta lendo no momento. Nesse caso o AWK esta lendo cada linha como sendo um registro, assim NR vai ser 1 na primeira linha lida, 2 na segunda, etc.

FNR é parecido porem ele é reiniciado a cada arquivo. assim no primeiro arquivo, FNR é igual a NR, no segundo arquivo eles serão diferentes.

vc poderia fazer

FNR==NR {a[$2]=$3 }
FNR!=NR {print $0,a[$2]?a[$2]:"NA"}
que daria no mesmo, entretanto foi usada a mutreta do next. next diz: leia a proxima linha fazendo TUDO de novo.

assim vc garantiu que 

FNR==NR {a[$2]=$3;next}
foi executado APENAS no primeiro arquivo e
{print $0,a[$2]?a[$2]:"NA"}
apenas no segundo arquivo.

no mais o operador $ pega o valor do campo corrente, no registro corrente e $0 representa o registro inteiro.
barbada né?

2015-04-14 16:13 GMT+02:00 Carlos Alberto Teixeira Magalhães address@hidden [shell-script] <address@hidden>:
 

Bom dia a todos.

Procurando sobre formas de manipular dois arquivos via AWK, encontrei o link (http://goo.gl/I7LBIX) que possui o exemplo abaixo:

> cat temp1
1      rs1    AA    10
1      rs2    DD    20
1      rs3    EE    30
1      rs4    RR    40
> cat temp2
1      rs1    Pascal
1      rs4    Albinoni
> awk 'FNR==NR{a[$2]=$3;next}{print $0,a[$2]?a[$2]:"NA"}' temp2 temp1
1      rs1    AA    10 Pascal
1      rs2    DD    20 NA
1      rs3    EE    30 NA
1      rs4    RR    40 Albinoni

Alguém poderia explicar o funcionamento do comando em negrito? Eu compreendo que o primeiro par de chaves indica o tratamento com a primeria entrada (arquivo temp2) e o segundo par de chaves indica o tratamento com a segunda entrada (arquivo temp1). a é um vetor mas não entendi a manipulação que é feita com ele.

Desde já, agradeço.

--
Carlos Alberto Teixeira Magalhães
Analista de Suporte III
Departamento de Informática - DI
Universidade Estadual do Ceará - UECE

A aplicação pediu: "Requires Windows XP, Vista, 7 or better". Então eu instalei Linux.
A Ciência da Computação nasceu para resolver problemas que não existiriam se não fosse o computador.




--
Tiago B. Peczenyj

http://about.me/peczenyj

reply via email to

[Prev in Thread] Current Thread [Next in Thread]