同等のものを知りたい
cat inputfile | sed 's/\(.\)/\1\n/g' | sort | uniq -c
https://stackoverflow.com/questions/4174113/how-to-gather-characters-usage-statistics-in-text-file-using-unix-commands で提示され、文字使用統計の生成文字の代わりに単純なバイトをカウントするバイナリファイルのテキストファイルで、つまり出力は次の形式である必要があります。
18383 57
12543 44
11555 127
8393 0
コマンドが文字の参照されたものと同じくらい長くかかるかどうかは問題ではありません。
文字のコマンドをバイナリファイルに適用すると、出力に、印刷できない文字の任意の長いシーケンスの統計が含まれます(説明は求めません)。
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
大きなファイルの場合、並べ替えを使用すると遅くなります。同等の問題を解決する短い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
つまり、バイナリファイルの内容の統計データを判断する場合、シグマとCVが重要になることがよくあります。シグマからのバイト偏差のASCIIサークルとしてすべてのデータをグラフ化するcmdlineプログラムを作成しました。
http://wp.me/p2FmmK-96
統計を抽出するために、grep、xargs、およびその他のツールとともに使用できます。
これは、Stephaneのod
回答に似ていますが、バイトのASCII値を示しています。また、頻度/発生回数でソートされています。
xxd -c1 my.file|cut -c10-|sort|uniq -c|sort -nr
多くのプロセスが開始されるため、これは効率的ではないと思いますが、単一ファイル、特に小さなファイルには適しています。
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 < file
入力ファイルをutf-8として扱います。他にも多くの文字セットが利用可能であり、ファイルに不正な文字が含まれていると失敗します。