Resultado

Resultado

Eu tenho um arquivo que contém algo parecido com 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 depois 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 "animal de cor durante a leitura" do referido 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 :)

Responder1

Algo assim 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 awkscript monitora quatro coisas:

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

Ele atualiza essas variáveis ​​dependendo do que for encontrado nas duas colunas de entrada.

  • Se a cor não for igual à lida mais recentemente, aumente cce lembre-seesseem vez disso, cor. Também redefina ace a.
  • Se o animal não for o mesmo que foi lido recentemente, aumente ace lembre-seesseanimal em vez disso.

Em seguida, imprima cce acpara cada linha de entrada.

Se for garantido que os animais em cada linha sejam únicos, pode-se livrar-se da avariável.

Responder2

perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'

O hash %hcontém keyA => counte scalar keys %hretorna o número de chaves em qualquer momento. Depois invertemos o resultado e os juntamos com 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

informação relacionada