Как собрать статистику возникновения байта в двоичном файле?

Вы попытались установить режим клавиши Backspace? Взгляните на :help bs и попробуйте следующее:

set bs=indent,eol,start

Существует также примечание в том разделе справки об использовании :fixdel "если Ваш <БАКАЛАВР НАУК> или ключ <Del> не делает то, что Вы хотите".

Вы, возможно, также должны установить "нет совместимый" (WRT к vi), таким образом, :set nocp.

12
23.05.2017, 15:40
5 ответов

С GNU od:

od -vtu1 -An -w1 my.file | sort -n | uniq -c

Или более эффективно с perl (также выводит счет (0) для несуществующих байтов):

perl -ne 'BEGIN{$/ = \4096};
          $c[$_]++ for unpack("C*");
          END{for ($i=0;$i<256;$i++) {
              printf "%3d: %d\n", $i, $c[$i]}}' my.file
8
27.01.2020, 19:55

Для больших файлов использование сортировки будет медленным. Я написал короткую программу на C для решения эквивалентной проблемы ( см. Эту суть для Makefile с тестами ):

#include <stdio.h>

#define BUFFERLEN 4096

int main(){
    // This program reads standard input and calculate frequencies of different
    // bytes and present the frequences for each byte value upon exit.
    //
    // Example:
    //
    //     $ echo "Hello world" | ./a.out
    //
    // Copyright (c) 2015 Björn Dahlgren
    // Open source: MIT License

    long long tot = 0; // long long guaranteed to be 64 bits i.e. 16 exabyte
    long long n[256]; // One byte == 8 bits => 256 unique bytes

    const int bufferlen = BUFFERLEN;
    char buffer[BUFFERLEN];
    int i;
    size_t nread;

    for (i=0; i<256; ++i)
        n[i] = 0;

    do {
        nread = fread(buffer, 1, bufferlen, stdin);
        for (i = 0; i < nread; ++i)
            ++n[(unsigned char)buffer[i]];
        tot += nread;
    } while (nread == bufferlen);
    // here you may want to inspect ferror of feof

    for (i=0; i<256; ++i){
        printf("%d ", i);
        printf("%f\n", n[i]/(float)tot);
    }
    return 0;
}

использование:

gcc main.c
cat my.file | ./a.out
4
27.01.2020, 19:55

Поскольку среднее, сигма и CV часто важны при оценке статистических данных о содержимом двоичных файлов, я создал программу cmdline, которая строит график всех этих данных в виде ascii круга отклонений байта от сигмы.
http://wp.me/p2FmmK-96
Ее можно использовать с grep, xargs и другими инструментами для извлечения статистики. enter image description here

3
27.01.2020, 19:55

Программа recode может сделать это быстро даже для больших файлов - статистика частоты либо для байтов, либо для символов различных наборов символов. Например. для подсчета частот байтов:

$ echo hello there > /tmp/q
$ recode latin1/..count-characters < /tmp/q
1  000A LF   1  0020 SP   3  0065 e    2  0068 h    2  006C l    1  006F o
1  0072 r    1  0074 t

Внимание - укажите ваш файл, который нужно перекодировать как стандартный ввод, в противном случае он автоматически заменит его частотами символов!

Используйте recode utf-8 / .. count-characters для обработки входного файла как utf-8. Доступно множество других наборов символов, и он не удастся, если файл содержит какие-либо недопустимые символы.

1
27.01.2020, 19:55

Это похоже на od Стефана. ответ, но он показывает значение байта ASCII. Он также сортируется по частоте / количеству появлений.

xxd -c1 my.file|cut -c10-|sort|uniq -c|sort -nr

Я не думаю, что это эффективно, поскольку запускается много процессов, но это хорошо для отдельных файлов, особенно небольших файлов.

0
27.01.2020, 19:55

Теги

Похожие вопросы