Resultado

Resultado

Tengo un archivo que contiene algo como lo siguiente:

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

Necesito incrementar un contador para cada color y luego para cada animal. Entonces, el rojo sería 1, el azul 2, el rosa 3. Luego, perro, gato, pájaro y caballo serían 1, 2, 3 y 4. Necesito que el hámster comience nuevamente en 1 porque estamos comenzando con un nuevo color.

Si hago un "animal de color mientras leo" de dicho archivo, ¿qué puedo hacer para comparar cuando el color ya no es igual al color anterior?

Estoy buscando algo como esto:

1.1  
1.2  
1.3  
1.4  
2.1  
2.2  
2.3  
3.1  
3.2  
3.3  
3.4  

Cualquier sugerencia será muy apreciada :)

Respuesta1

Algo como esto con 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

El awkguión realiza un seguimiento de cuatro cosas:

  1. El nombre del animal leído más recientemente, a.
  2. El color leído más recientemente, c.
  3. El "contador de animales", ac.
  4. El "contador de colores", cc.

Actualiza estas variables dependiendo de lo que se encuentre en las dos columnas de entrada.

  • Si el color no es el mismo que el que se leyó más recientemente, incremente ccy recuerdeestecolor en su lugar. También restablecer acy a.
  • Si el animal no es el mismo que el leído más recientemente, increméntelo acy recuerdeesteanimal en su lugar.

Luego imprima ccy acpara cada línea de entrada.

Si se garantiza que los animales en cada línea serán únicos, uno podría deshacerse de la avariable.

Respuesta2

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

El hash %hcontiene keyA => county scalar keys %hdevuelve el número de claves en cualquier momento. Luego invertimos el resultado y los unimos con una coma.

Resultado

1.1
1.2
1.3
1.4
2.1
2.2
2.3
3.1
3.2
3.3
3.4

información relacionada