Você pode fazer isso da maneira clássica * nix, encadeando pequenos comandos juntos. Primeiro, encontre os arquivos de interesse, para isso você pode usar globbing :
for i in *_*_*; do echo "$i"; done
Esse comando imprimirá todos os arquivos no diretório atual cujo nome contém dois sublinhados. Para extrair a string entre esses underscores, você poderia usar cut
, dizendo para usar _
como delimitador de campo e para imprimir o 2º campo:
cut -d '_' -f 2
Piping o primeiro comando através do segundo irá imprimir as seqüências de caracteres que você está interessado, mas também irá imprimir uma linha vazia para os casos em que não há nenhum caractere entre os sublinhados ( foo__bar
, por exemplo). Você pode filtrá-los usando grep .
, que imprimirá apenas linhas que contenham pelo menos um caractere (incluindo espaço em branco). Finalmente, você pode contar passando a saída através de sort
e uniq -c
.
Colocando tudo junto, você ganha:
$ for i in *_*_*; do echo "$i" | cut -d '_' -f 2 ; done |
grep . | sort | uniq -c
3 ABC
2 DEF
1 MNO
Se você realmente quer que o número esteja do outro lado, você pode usar awk
:
$ for i in *_*_*; do echo "$i" | cut -d '_' -f 2 ; done |
grep . | sort | uniq -c | awk '{print $2,$1}'
ABC 3
DEF 2
MNO 1