동일한 바이트를 그룹화하여 파일의 바이트 수를 계산하는 방법은 무엇입니까? [복사]

동일한 바이트를 그룹화하여 파일의 바이트 수를 계산하는 방법은 무엇입니까? [복사]

예: "mybinaryfile" 파일이 있고 16진수 내용은 다음과 같습니다.

A0 01 00 FF 77 01 77 01 A0

이 파일에 A0 바이트가 몇 개 있는지, 01이 몇 개 있는지 등을 알아야 합니다. 결과는 다음과 같습니다.

A0: 2
01: 3
00: 1
FF: 1
77: 2

셸에서 직접 계산을 수행할 수 있는 방법이 있습니까? 아니면 이 특정 작업을 수행하려면 어떤 언어로든 프로그램을 작성해야 합니까?

답변1

이는 다음을 사용합니다.OD한 줄에 하나의 16진수 값을 표시한 다음 정렬하고 계산합니다.

od -t x1 -w1 -v -An mybinaryfile | sort | uniq -c

( -w1확장이며 다음으로 만들어지지 않았습니다.POSIX.)

답변2

Perl을 사용하여 슬러핑된 파일을 바이트 배열로 압축 해제한 다음 해시를 사용하여 고유 바이트 수를 계산합니다.

printf '\xA0\x01\x00\xFF\x77\x01\x77\x01\xA0' | 
  perl -0777 -nE '
    @bytes = unpack("C*",$_) 
    }{ 
    $counts{$_}++ for @bytes; 
    for $k (sort { $a <=> $b } keys %counts) {
      printf "%02X: %d\n", $k, $counts{$k}
    }
 '
00: 1
01: 3
77: 2
A0: 2
FF: 1

최신 버전을 List::MoreUtils사용할 수 있는 경우 해당 기능을 사용하여 계산을 단순화할 수 frequency있습니다.

답변3

빠른 Python 솔루션:

#!/usr/bin/env python3
import sys, itertools, collections
print(
    *itertools.starmap(
        "{:02X}: {:d}".format,
        collections.Counter(sys.stdin.detach().read()).items()),
    sep="\n")

하나의 선:

python3 -c 'import sys, itertools, collections; print(*itertools.starmap("{:02X}: {:d}".format, collections.Counter(sys.stdin.detach().read()).items()), sep="\n")' \
    < input.bin

옵션 및 고려 사항

  • 출력을 빈도별로 내림차순으로 정렬하려면 다음 .items()으로 바꾸십시오..most_common(). 또는 다른 정렬 방식의 경우 내장된sorted()기능을 사용하거나 사후 처리 출력을 사용합니다.sort(1)프로그램.

  • 현재 상태에서 프로그램은 전체 표준 입력 데이터를 바이트 버퍼에 넣는데, 이는 상대적으로 작은 파일에 적합합니다. 더 큰 파일의 경우 프로그램을 다음과 같이 다시 작성해야 합니다.파일을 청크 단위로 읽기.

답변4

파일이 큰 경우 계산하면서 정렬할 수 있습니다.

od -t x1 -w1 -v -An binaryfile |
    awk '{h[$1]++} END {for (v in h) {printf "%d\t%s\n", h[v], v} }' |
    sort -k2

POSIX 솔루션이 필요한 경우

od -t x1 -v -An binaryfile |
    tr ' ' '\n' |
    awk '$1 > "" { h[$1]++ } END { for (v in h) {printf "%d\t%s\n", h[v], v} }' |
    sort -k2

관련 정보