Como posso usar várias instruções if dentro de outra instrução if de um programa awk?

2

Eu tenho um arquivo CSV e quero ter várias verificações para recuperar os dados do arquivo CSV. Eu tenho as seguintes condições que precisam ser atendidas e estou tentando usar o awk em um shell script para preencher estas condições:

if ( ColD == "TRX" || ColD == "TX" )
{
   if (ColJ == "BTS INT UNAFF" || ColJ == "LOCAL MODE")
   {
      if (ColL !="OPER" && ColL != "") #Second Value shouldn't be blank
      {
         if (ColU != "2000")
         {
             if (ColA != "*_*") # Should not contain _ in the value.
             then
                   print all the resulting filtered columns of this csv file

Aqui ColA, ColB etc. são os números das colunas que eu uso como $ 1, $ 2 e assim por diante.

Agora eu sei o uso do awk simples de uma única condição if é algo assim:

awk -F, '{
                if ($23 == "TOP36")
                print $11
            }' $INPUT_PATH/$fileName

e poderia encontrar as condições aninhadas if algo assim:

awk '
{if ( $6 == 0 && $8 > 0 && $8 <= 9 ) { $6 = "left" } else {
  if ( $8 == 0 && $6 > 0 && $6 <= 15 ) { $6 = "bottom" } else {
    if ( $8 == 9 && $6 > 0 && $6 <= 15 { $6 = "top" } else {
      if ( $6 == 15 && $8 > 0 && $8 <= 9 { $6 = "right" }
      }
    }
  }
} {print}'

Mas, eu acho que minhas condições podem ser satisfeitas se eu colocar uma condição if if no topo e depois na próxima e assim por diante. Como posso fazer isso usando o awk if statements? Existe uma maneira melhor de fazer isso?

    
por Ankit Vashistha 15.07.2015 / 12:16

1 resposta

4

Aninhadas if declarações são efetivamente declaração and declaração , então se você não precisa fazer nenhum processamento em particular enquanto avança pelo aninhamento, então você pode apenas juntar todos eles com && .

  awk '{ if( ( $4 == "TRX" || $4 == "TX" ) &&
             ( $10 == "BTS INT UNAFF" || $10 == "LOCAL MODE" ) && 
             ( $12 != "OPER" && $12 != "" ) && # Second Value should not be blank
             ( $22 != "2000") &&
             ( !match( $1, "_") ) ) # Should not contain _ in the value.
           { print } 
       }' FS=, file

Para definir seu separador de campo, você pode usar a opção -F, em vez do parâmetro FS=, se preferir - ou tê-lo totalmente contido dentro do awk código, no bloco BEGIN{ } de processamento de pré-arquivos: BEGIN{ FS="," }

    
por 15.07.2015 / 20:10