conta a entrada única em uma coluna específica entre o padrão de pesquisa

1

Arquivo de entrada

Device Robot Drive       Robot                    Drive                Device      Second
Type     Num Index  Type DrNum Status  Comment    Name                 Path        Device Path
robot      0    -    TLD    -       -  -          -                    /dev/sg66
  drive    -    0 hcart2    3      UP  -          IBM.ULT3580-TD5.006  /dev/nst17
  drive    -    1 hcart2    4      UP  -          IBM.ULT3580-TD5.000  /dev/nst16
  drive    -    2 hcart2    5      UP  -          IBM.ULT3580-TD5.001  /dev/nst15
  drive    -    3 hcart2    6      UP  -          IBM.ULT3580-TD5.002  /dev/nst14
  drive    -    4 hcart2    2      UP  -          IBM.ULT3580-TD5.007  /dev/nst13
  drive    -    5 hcart2    1      UP  -          IBM.ULT3580-TD5.008  /dev/nst12
  drive    -    6 hcart2   12    DOWN  -          IBM.ULT3580-TD5.003  /dev/nst11
  drive    -    6 hcart2   12    DOWN  -          IBM.ULT3580-TD5.003  /dev/nst1
  drive    -    7 hcart2   10      UP  -          IBM.ULT3580-TD5.004  /dev/nst10
  drive    -    7 hcart2   10      UP  -          IBM.ULT3580-TD5.004  /dev/nst9
  drive    -    8 hcart2    9      UP  -          IBM.ULT3580-TD5.005  /dev/nst5
  drive    -    8 hcart2    9      UP  -          IBM.ULT3580-TD5.005  /dev/nst6
  drive    -    9 hcart2    8      UP  -          IBM.ULT3580-TD5.009  /dev/nst4
  drive    -    9 hcart2    8    DOWN  -          IBM.ULT3580-TD5.009  /dev/nst2
  drive    -   10 hcart2    7      UP  -          IBM.ULT3580-TD5.010  /dev/nst3
  drive    -   10 hcart2    7      UP  -          IBM.ULT3580-TD5.010  /dev/nst0
robot      1    -    TLD    -       -  -          -                    /dev/sg55
  drive    -   11 hcart2    4      UP  -          IBM.ULT3580-HH5.000  /dev/nst19
  drive    -   12 hcart2    2      UP  -          IBM.ULT3580-HH5.001  /dev/nst18
  drive    -   13 hcart2    1      UP  -          IBM.ULT3580-HH5.002  /dev/nst8
  drive    -   14 hcart2    3      UP  -          IBM.ULT3580-HH5.003  /dev/nst7

Eu quero descobrir ou melhor colocar em uma variável que o robô 0 tem 11 unidades (contagem única de campo 3) sob ele e o robô 1 tem 4

Precisa ignorar as 2 primeiras linhas que eu estava fazendo através do awk NR > 2

Poderia haver muitos dos robôs 0,1,2,3 Então eu preciso de código genérico que eu tentei com o awk, mas não consegui um código definitivo.

Saída

robot 0 : 11 
robot 1 : 4

e assim por diante

    
por Sid 15.12.2017 / 12:39

2 respostas

3

Awk solução:

awk '/robot/{ 
         if (r){ printf "%s : %d\n", r, c; c=0; delete a } 
         r = $1 OFS $2; 
     }
     /drive/ && !a[$3]++{ c++ }
     END{ printf "%s : %d\n", r, c }' file
  • r = $1 OFS $2 - "robô" nome
  • delete a - exclui todos os elementos da matriz a . (A seguinte declaração fornece uma maneira portátil mas não óbvia de limpar uma matriz: split("", array) )
  • c++ - conta números "drive" únicos para um determinado "robot"

A saída:

robot 0 : 11
robot 1 : 4
    
por 15.12.2017 / 13:00
0
awk '$1=="robot" && $2 == "1" {x=NR+5} (NR<=x) {print}' test  | awk '{print $3}' | sed '/-/d' |wc -l | awk '{print "robot1:" " "  $0}'

robot1: 4

 awk 'NR >2 {print $0}' test  |sed -n '/robot/,/robot/{x;p;d;};x'| sed '/^$/d' | sed '/robot/d' | awk '{print $3}' | sort | uniq | wc -l | awk '{print "robot0:" " " $1}'

robot0: 11

    
por 15.12.2017 / 17:02