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

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

Re: [shell-script] Condicional else if no AWK


From: Tiago Peczenyj
Subject: Re: [shell-script] Condicional else if no AWK
Date: Wed, 17 Aug 2016 10:50:18 +0200

vamos la

agora que eu tenho um computador com linux e awk na minha frente eu posso dar exemplos melhores

vejamos, vc tem um arquivo contendo varios registros ( um por linha ) e cada registro vc tem campos ( uns 10 pelo menos ). vc tem uma regra de validação e uma regra de coerção ( quando um campo estiver vazio, substituir por x).

O que eu sugeri foi fazer

awk -opções '{ seu script }' arquivo


Primeiro vamos esclarecer as regras: vc esta procurando linhas que tenha 10 campos no total. Por isso o primeiro NF == 10

awk -opções 'NF == 10 { seu script }' arquivo

agora as regras:

se os campos 1, 2 ou 3 nao estiverem presentes, 

entao  deve ser considerado um erro.

caso contrario vamos imprimir os campos 1 a 3, 5 a 8

fim-se

perceba como isso se torna um if/else naturalmente


agora vc tem a repeticao muitas vezes length($x) == 0

vc pode fazer isso:

if(! length($x)) { ... }

que é equivalente.

Outra coisa: se vc precisa trocar 4 campos por NULL se estiverem vazios, vc pode fazer

for( i=5;i<=8;i++) { 
  if(! length($i) ) { 
    $i = "NULL"; 
  } 
}

entretanto aqui vc tem 5 linhas ( se vc curte uma boa legibilidade ) e um laço for que não é exatamente obvio. para verificar 4 campos eu consideraria continuar com 4 ifs seguidos. para 40 eu consideraria um loop for.

para ficar mais eloquente

function campos_presentes() {
  return length($1) && length($2) && length($3);
}

function nulificar() {
   if (! length($5))  {$5="NULL"}
   if (! length($6))  {$6="NULL"
   if (! length($7))  {$7="NULL"}
   if (! length($8))  {$8="NULL"}
}

NF == 10 {
  if( campos_presentes() ) {
    nulificar();
    print ; # aquela coisa
  } else {
    print "erro, registro #",NR," tem um campo ausente";
  }
}

2016-08-16 20:31 GMT+02:00 address@hidden [shell-script] <address@hidden>:
 

Caro m0delito

O que o Tiago disse está corretíssimo.

O que temos aqui é um problema de lógica

O "ifs" existentes redirecionavam em função de um erro mudando o fluxo e caso não tenha erro monta a SQL desejada:

O que vc quer não é mais redirecionar para um arquivo de erro, mas mudar o valor dos campos para NULL caso estejam vazio.

Pode ser assim:

NF==10 {
 if (length($1)==0) { print "CAMPO1 - OBRIGATORIO" >> "error.log" }
 else if (length($2)==0) { print "CAMPO2 - OBRIGATORIO" >> "error.log" }
 else if (length($3)==0) { print "CAMPO3 - OBRIGATORIO" >> "error.log" }
 else {
   if (length($5)==0)  {$5="NULL"}
   if (length($6)==0)  {$6="NULL"}
   if (length($7)==0)  {$7="NULL"}
   if (length($8)==0)  {$8="NULL"}
   print $1, $2, $3, $5, $6,$7,$8 >> "arquivo.sql"
 }

}

Outra forma interessante para apontar o valor NULL para os campos pode ser nesse formato
Em vez de:
if (length($5)==0)  {$5="NULL"}

pode ser:
$5 = ( length($5)==0 ? "NULL" : $5 )

Isso ajuda?

[]'s
Itamar




--
Tiago B. Peczenyj

http://about.me/peczenyj

reply via email to

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