예: "mybinaryfile" 파일이 있고 16진수 내용은 다음과 같습니다.
A0 01 00 FF 77 01 77 01 A0
이 파일에 A0 바이트가 몇 개 있는지, 01이 몇 개 있는지 등을 알아야 합니다. 결과는 다음과 같습니다.
A0: 2
01: 3
00: 1
FF: 1
77: 2
셸에서 직접 계산을 수행할 수 있는 방법이 있습니까? 아니면 이 특정 작업을 수행하려면 어떤 언어로든 프로그램을 작성해야 합니까?
답변1
답변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