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 awk
script monitora quatro coisas:
- O nome do animal lido mais recentemente,
a
. - A cor lida mais recentemente,
c
. - O "contador de animais",
ac
. - 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
cc
e lembre-seesseem vez disso, cor. Também redefinaac
ea
. - Se o animal não for o mesmo que foi lido recentemente, aumente
ac
e lembre-seesseanimal em vez disso.
Em seguida, imprima cc
e ac
para cada linha de entrada.
Se for garantido que os animais em cada linha sejam únicos, pode-se livrar-se da a
variável.
Responder2
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 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