Filtragem de texto usando o awk

0
echo "Start 2A25.20090401.64809.7.HDF 6420 6751" 
echo "dimensions 9249 49"  
echo "New Cell"   
grep "6621,38" out.2A25.20090401.64809.7.HDF.txt.text = 36.58   7.52  77.82 210
grep "6623,41" out.2A25.20090401.64809.7.HDF.txt.text = 28.62   7.59  77.96 210
grep "6624,40" out.2A25.20090401.64809.7.HDF.txt.text = 33.74   7.52  77.96 210
grep "6624,41" out.2A25.20090401.64809.7.HDF.txt.text = 42.25   7.56  77.99 210
grep "6625,41" out.2A25.20090401.64809.7.HDF.txt.text = 30.58   7.54  78.02 210
grep "6627,40" out.2A25.20090401.64809.7.HDF.txt.text = 34.5   7.46  78.05 200
grep "6628,39" out.2A25.20090401.64809.7.HDF.txt.text = 35.57   7.40  78.05 200
grep "6628,40" out.2A25.20090401.64809.7.HDF.txt.text = 44.82   7.44  78.08 200
grep "6628,41" out.2A25.20090401.64809.7.HDF.txt.text = 21.35   7.47  78.11 210
grep "6629,40" out.2A25.20090401.64809.7.HDF.txt.text = 26.67   7.41  78.11 210
grep "6630,41" out.2A25.20090401.64809.7.HDF.txt.text = 28.12   7.43  78.17 210
grep "6631,40" out.2A25.20090401.64809.7.HDF.txt.text = 21.4   7.37  78.17 272
grep "6631,41" out.2A25.20090401.64809.7.HDF.txt.text = 47.3   7.41  78.20 200
grep "6631,42" out.2A25.20090401.64809.7.HDF.txt.text = 27.42   7.45  78.22 210
grep "6632,41" out.2A25.20090401.64809.7.HDF.txt.text = 39.42   7.39  78.23 200
grep "6632,42" out.2A25.20090401.64809.7.HDF.txt.text = 26.53   7.42  78.25 210
grep "6632,43" out.2A25.20090401.64809.7.HDF.txt.text = 27.72   7.46  78.28 210
grep "6632,44" out.2A25.20090401.64809.7.HDF.txt.text = 41.01   7.50  78.31 210
grep "6631,44" out.2A25.20090401.64809.7.HDF.txt.text = 34.26   7.52  78.28 210
grep "6632,45" out.2A25.20090401.64809.7.HDF.txt.text = 23.02   7.54  78.33 210
grep "6633,41" out.2A25.20090401.64809.7.HDF.txt.text = 32.5   7.36  78.26 272
grep "6633,42" out.2A25.20090401.64809.7.HDF.txt.text = 32.82   7.40  78.28 210
grep "6633,43" out.2A25.20090401.64809.7.HDF.txt.text = 39.28   7.44  78.31 210
grep "6634,41" out.2A25.20090401.64809.7.HDF.txt.text = 26.09   7.34  78.29 272
grep "6634,42" out.2A25.20090401.64809.7.HDF.txt.text = 41.54   7.38  78.31 210
grep "6634,43" out.2A25.20090401.64809.7.HDF.txt.text = 42.26   7.42  78.34 210
grep "6635,42" out.2A25.20090401.64809.7.HDF.txt.text = 31.53   7.36  78.34 210
grep "6635,43" out.2A25.20090401.64809.7.HDF.txt.text = 34.19   7.40  78.37 210
grep "6636,43" out.2A25.20090401.64809.7.HDF.txt.text = 29.9   7.37  78.40 292
echo "New Cell"   
grep "6622,14" out.2A25.20090401.64809.7.HDF.txt.text = 22.24   6.61  77.22 291
grep "6622,15" out.2A25.20090401.64809.7.HDF.txt.text = 29.63   6.65  77.25 291
grep "6623,15" out.2A25.20090401.64809.7.HDF.txt.text = 30.63   6.63  77.28 291
echo "New Cell"   
grep "6630,45" out.2A25.20090401.64809.7.HDF.txt.text = 31.44   7.59  78.27 292
echo "New Cell"   
grep "6646,47" out.2A25.20090401.64809.7.HDF.txt.text = 27.52   7.31  78.81 210
grep "6647,47" out.2A25.20090401.64809.7.HDF.txt.text = 38.67   7.29  78.84 210
grep "6648,47" out.2A25.20090401.64809.7.HDF.txt.text = 37.08   7.27  78.87 210
echo "New Cell"   

Meu arquivo de texto é mostrado acima. A coluna 5 é o valor que me interessa. Na última linha postada acima, seu valor é 37,08.

Eu quero manter apenas os grupos (que são separados por echo "New Cell") em que pelo menos um valor é > = 35

Eu tentei:

awk '$5>=35 || /New Cell/ || /Start/ || /dimen/ || /Done/ || /End/' \
  CWoSpix.apr2009.sh*

Mas está removendo todas as linhas em que o valor da quinta coluna é < 35.

A saída esperada é:

echo "Start 2A25.20090401.64809.7.HDF 6420 6751" 
echo "dimensions 9249 49"  
echo "New Cell"   
grep "6621,38" out.2A25.20090401.64809.7.HDF.txt.text = 36.58   7.52  77.82 210
grep "6623,41" out.2A25.20090401.64809.7.HDF.txt.text = 28.62   7.59  77.96 210
grep "6624,40" out.2A25.20090401.64809.7.HDF.txt.text = 33.74   7.52  77.96 210
grep "6624,41" out.2A25.20090401.64809.7.HDF.txt.text = 42.25   7.56  77.99 210
grep "6625,41" out.2A25.20090401.64809.7.HDF.txt.text = 30.58   7.54  78.02 210
grep "6627,40" out.2A25.20090401.64809.7.HDF.txt.text = 34.5   7.46  78.05 200
grep "6628,39" out.2A25.20090401.64809.7.HDF.txt.text = 35.57   7.40  78.05 200
grep "6628,40" out.2A25.20090401.64809.7.HDF.txt.text = 44.82   7.44  78.08 200
grep "6628,41" out.2A25.20090401.64809.7.HDF.txt.text = 21.35   7.47  78.11 210
grep "6629,40" out.2A25.20090401.64809.7.HDF.txt.text = 26.67   7.41  78.11 210
grep "6630,41" out.2A25.20090401.64809.7.HDF.txt.text = 28.12   7.43  78.17 210
grep "6631,40" out.2A25.20090401.64809.7.HDF.txt.text = 21.4   7.37  78.17 272
grep "6631,41" out.2A25.20090401.64809.7.HDF.txt.text = 47.3   7.41  78.20 200
grep "6631,42" out.2A25.20090401.64809.7.HDF.txt.text = 27.42   7.45  78.22 210
grep "6632,41" out.2A25.20090401.64809.7.HDF.txt.text = 39.42   7.39  78.23 200
grep "6632,42" out.2A25.20090401.64809.7.HDF.txt.text = 26.53   7.42  78.25 210
grep "6632,43" out.2A25.20090401.64809.7.HDF.txt.text = 27.72   7.46  78.28 210
grep "6632,44" out.2A25.20090401.64809.7.HDF.txt.text = 41.01   7.50  78.31 210
grep "6631,44" out.2A25.20090401.64809.7.HDF.txt.text = 34.26   7.52  78.28 210
grep "6632,45" out.2A25.20090401.64809.7.HDF.txt.text = 23.02   7.54  78.33 210
grep "6633,41" out.2A25.20090401.64809.7.HDF.txt.text = 32.5   7.36  78.26 272
grep "6633,42" out.2A25.20090401.64809.7.HDF.txt.text = 32.82   7.40  78.28 210
grep "6633,43" out.2A25.20090401.64809.7.HDF.txt.text = 39.28   7.44  78.31 210
grep "6634,41" out.2A25.20090401.64809.7.HDF.txt.text = 26.09   7.34  78.29 272
grep "6634,42" out.2A25.20090401.64809.7.HDF.txt.text = 41.54   7.38  78.31 210
grep "6634,43" out.2A25.20090401.64809.7.HDF.txt.text = 42.26   7.42  78.34 210
grep "6635,42" out.2A25.20090401.64809.7.HDF.txt.text = 31.53   7.36  78.34 210
grep "6635,43" out.2A25.20090401.64809.7.HDF.txt.text = 34.19   7.40  78.37 210
grep "6636,43" out.2A25.20090401.64809.7.HDF.txt.text = 29.9   7.37  78.40 292
echo "New Cell"   
echo "New Cell"   
grep "6630,45" out.2A25.20090401.64809.7.HDF.txt.text = 31.44   7.59  78.27 292
echo "New Cell"   
grep "6646,47" out.2A25.20090401.64809.7.HDF.txt.text = 27.52   7.31  78.81 210
grep "6647,47" out.2A25.20090401.64809.7.HDF.txt.text = 38.67   7.29  78.84 210
grep "6648,47" out.2A25.20090401.64809.7.HDF.txt.text = 37.08   7.27  78.87 210
echo "New Cell"   

Como o awk pode ser usado para obter o resultado desejado?

    
por geet 03.01.2018 / 12:10

1 resposta

1

Awk solução:

awk '/Start|End|Done|dimen/{ print }
     /echo "New Cell"/{ 
         if (f) { 
             if (max >= 35) { 
                 for (i=1; i<=c; i++) print a[i]; 
                 print 
             } 
             delete a; c=max=0 
         } 
         f=1 
     }f{ a[++c]=$0; if ($5 > max) max=$5 }' file

Detalhes:

  • /Start|End|Done|dimen/{ print } - imprime linhas contendo Start ou End ou Done ou dimen substring como são
  • /echo "New Cell"/{ ... } - ao encontrar linha com o padrão echo "New Cell" :
    • if (f) { ... } - se não for a linha do primeiro padrão e a seção anterior foi processada:
      • if (max >= 35) - se o máximo entre os valores do quinto campo na seção recente for maior de igual a 35 :
        • for (i=1; i<=c; i++) print a[i] - imprime todas as linhas da seção recente ( c é o último índice da matriz a e aponta para o tamanho da matriz)
      • delete a - limpe a matriz a (exclua todos os itens da matriz a )
      • c=max=0 - redefine as variáveis cruciais
    • f=1 - sinalizador ativado e indicando seção ativa (um monte de linhas) para processamento
  • f{ ... } - na seção ativa sendo processada:
    • a[++c]=$0 - captura cada registro / linha $0 com uma seção no array a . A matriz é indexada com números consecutivos por ++c
    • if ($5 > max) max=$5 - determinando o valor máximo max entre os valores do 5º campo $5 dentro de um grupo de registros processados

A saída:

echo "Start 2A25.20090401.64809.7.HDF 6420 6751" 
echo "dimensions 9249 49"  
echo "New Cell"   
grep "6621,38" out.2A25.20090401.64809.7.HDF.txt.text = 36.58   7.52  77.82 210
grep "6623,41" out.2A25.20090401.64809.7.HDF.txt.text = 28.62   7.59  77.96 210
grep "6624,40" out.2A25.20090401.64809.7.HDF.txt.text = 33.74   7.52  77.96 210
grep "6624,41" out.2A25.20090401.64809.7.HDF.txt.text = 42.25   7.56  77.99 210
grep "6625,41" out.2A25.20090401.64809.7.HDF.txt.text = 30.58   7.54  78.02 210
grep "6627,40" out.2A25.20090401.64809.7.HDF.txt.text = 34.5   7.46  78.05 200
grep "6628,39" out.2A25.20090401.64809.7.HDF.txt.text = 35.57   7.40  78.05 200
grep "6628,40" out.2A25.20090401.64809.7.HDF.txt.text = 44.82   7.44  78.08 200
grep "6628,41" out.2A25.20090401.64809.7.HDF.txt.text = 21.35   7.47  78.11 210
grep "6629,40" out.2A25.20090401.64809.7.HDF.txt.text = 26.67   7.41  78.11 210
grep "6630,41" out.2A25.20090401.64809.7.HDF.txt.text = 28.12   7.43  78.17 210
grep "6631,40" out.2A25.20090401.64809.7.HDF.txt.text = 21.4   7.37  78.17 272
grep "6631,41" out.2A25.20090401.64809.7.HDF.txt.text = 47.3   7.41  78.20 200
grep "6631,42" out.2A25.20090401.64809.7.HDF.txt.text = 27.42   7.45  78.22 210
grep "6632,41" out.2A25.20090401.64809.7.HDF.txt.text = 39.42   7.39  78.23 200
grep "6632,42" out.2A25.20090401.64809.7.HDF.txt.text = 26.53   7.42  78.25 210
grep "6632,43" out.2A25.20090401.64809.7.HDF.txt.text = 27.72   7.46  78.28 210
grep "6632,44" out.2A25.20090401.64809.7.HDF.txt.text = 41.01   7.50  78.31 210
grep "6631,44" out.2A25.20090401.64809.7.HDF.txt.text = 34.26   7.52  78.28 210
grep "6632,45" out.2A25.20090401.64809.7.HDF.txt.text = 23.02   7.54  78.33 210
grep "6633,41" out.2A25.20090401.64809.7.HDF.txt.text = 32.5   7.36  78.26 272
grep "6633,42" out.2A25.20090401.64809.7.HDF.txt.text = 32.82   7.40  78.28 210
grep "6633,43" out.2A25.20090401.64809.7.HDF.txt.text = 39.28   7.44  78.31 210
grep "6634,41" out.2A25.20090401.64809.7.HDF.txt.text = 26.09   7.34  78.29 272
grep "6634,42" out.2A25.20090401.64809.7.HDF.txt.text = 41.54   7.38  78.31 210
grep "6634,43" out.2A25.20090401.64809.7.HDF.txt.text = 42.26   7.42  78.34 210
grep "6635,42" out.2A25.20090401.64809.7.HDF.txt.text = 31.53   7.36  78.34 210
grep "6635,43" out.2A25.20090401.64809.7.HDF.txt.text = 34.19   7.40  78.37 210
grep "6636,43" out.2A25.20090401.64809.7.HDF.txt.text = 29.9   7.37  78.40 292
echo "New Cell"   
echo "New Cell"   
grep "6646,47" out.2A25.20090401.64809.7.HDF.txt.text = 27.52   7.31  78.81 210
grep "6647,47" out.2A25.20090401.64809.7.HDF.txt.text = 38.67   7.29  78.84 210
grep "6648,47" out.2A25.20090401.64809.7.HDF.txt.text = 37.08   7.27  78.87 210
echo "New Cell"
    
por 03.01.2018 / 12:42