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 awk
guión realiza un seguimiento de cuatro cosas:
- El nombre del animal leído más recientemente,
a
. - El color leído más recientemente,
c
. - El "contador de animales",
ac
. - 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
cc
y recuerdeestecolor en su lugar. También restablecerac
ya
. - Si el animal no es el mismo que el leído más recientemente, increméntelo
ac
y recuerdeesteanimal en su lugar.
Luego imprima cc
y ac
para cada línea de entrada.
Si se garantiza que los animales en cada línea serán únicos, uno podría deshacerse de la a
variable.
Respuesta2
perl -pale '$_ = join ".", reverse ++$h{$F[0]}, scalar keys %h'
El hash %h
contiene keyA => count
y scalar keys %h
devuelve 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