Eu gostaria de saber o equivalente a
cat inputfile | sed 's/\(.\)/\1\n/g' | sort | uniq -c
apresentado em /programming/4174113/how-to-gather-characters-usage-statistics-in-text-file-using-unix-comands para produção de estatísticas de uso de caracteres em arquivos de texto para contagem de arquivos binários bytes simples em vez de caracteres, ou seja, a saída deve estar na forma de
18383 57
12543 44
11555 127
8393 0
Não importa se o comando leva tanto tempo quanto o comando referenciado para caracteres.
Se eu aplicar o comando para caracteres em arquivos binários, a saída conterá estatísticas para seqüências longas arbitrárias de caracteres não imprimíveis (não busco explicações para isso).
command-line
files
binary
statistics
Karl Richter
fonte
fonte
| sort -n
e| sort -n -r
por ordem decrescente, respectivamente (a classificação não fazia parte da pergunta). A classificação pode ser melhor ...sort -n
aqui faz muito mais sentido. Resposta atualizada.Para arquivos grandes, o uso da classificação será lento. Eu escrevi um pequeno programa em C para resolver o problema equivalente ( veja esta lista do Makefile com testes ):
uso:
fonte
fgets
obtém uma linha, não um buffer cheio. Você está varrendo o buffer completo de 4096 bytes para cada linha lida no stdin. Você precisafread
aqui, nãofgets
.if
bloco em torno das declarações printf, que faz com que a saída mais legível se alguns bytes não ocorrem no arquivo de entrada: gist.github.com/martinvonwittich/...Como média, sigma e CV são frequentemente importantes ao julgar dados estatísticos do conteúdo de arquivos binários, criei um programa cmdline que representa graficamente todos esses dados como um círculo ascii de desvios de bytes do sigma.
http://wp.me/p2FmmK-96
Ele pode ser usado com grep, xargs e outras ferramentas para extrair estatísticas.
fonte
O
recode
programa pode fazer isso rapidamente, mesmo para arquivos grandes, estatísticas de frequência, tanto para bytes quanto para caracteres de vários conjuntos de caracteres. Por exemplo, para contar frequências de bytes:Cuidado - especifique seu arquivo para recodificar como entrada padrão; caso contrário, ele será substituído silenciosamente pelas frequências de caracteres!
Use
recode utf-8/..count-characters < file
para tratar o arquivo de entrada como utf-8. Muitos outros conjuntos de caracteres estão disponíveis e falhará se o arquivo contiver caracteres ilegais.fonte
Isso é semelhante à
od
resposta de Stephane, mas mostra o valor ASCII do byte. Também é classificado por frequência / número de ocorrências.Eu não acho que isso seja eficiente, pois muitos processos são iniciados, mas é bom para arquivos únicos, principalmente arquivos pequenos.
fonte