Redefina o contador quando a alteração ocorre durante a leitura

0

Eu tenho um arquivo que contém algo como o seguinte:

red dog  
red cat  
red bird  
red horse  
blue hamster  
blue monkey  
blue lion  
pink pony  
pink whale  
pink pig  
pink dolphin 

Preciso incrementar um contador para cada cor e, em seguida, para cada animal. Então vermelho seria 1, azul 2, rosa 3. Em seguida, cachorro, gato, pássaro e cavalo seriam 1, 2, 3 e 4. Preciso que o hamster comece em 1 novamente porque estamos começando uma nova cor.

Se eu fizer um "while read color animal" do arquivo, o que posso fazer para comparar quando a cor não é mais igual à cor anterior?

Estou procurando algo assim:

1.1  
1.2  
1.3  
1.4  
2.1  
2.2  
2.3  
3.1  
3.2  
3.3  
3.4  

Qualquer sugestão seria muito apreciada:)

    
por noname 12.04.2017 / 08:16

2 respostas

1

Algo parecido com isso com awk :

$ awk '$1 != c { cc++; c=$1; ac=0; a="" } $2 != a { ac++; a=$2 } { printf("%d.%d\n", cc, ac) }' file
1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4

O script awk registra quatro coisas:

  1. O nome do animal mais lido, a .
  2. A cor de leitura mais recente, c .
  3. O "contador de animais", ac .
  4. O "contador de cores", cc .

Atualiza essas variáveis dependendo do que é encontrado nas duas colunas de entrada.

  • Se a cor não for igual à mais recente, incremente cc e lembre-se desta cor. Também redefinir ac e a .
  • Se o animal não for igual ao que foi lido mais recentemente, incremente ac e lembre-se deste animal
  • .

Em seguida, imprima cc e ac para cada linha de entrada.

Se os animais em cada linha forem únicos, você pode se livrar da variável a .

    
por 12.04.2017 / 08:38
0
perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'

O hash %h contém keyA => count e scalar keys %h retorna o número de chaves a qualquer momento. Então, invertemos o resultado e juntamo-nos com uma vírgula.

Resultado

1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4
    
por 12.04.2017 / 08:37