5

大きなファイル (50 GB) があり、その中のさまざまな行の出現回数を数えたいと思います。通常、私は使用します

sort bigfile | uniq -c

ただし、ファイルが十分に大きいため、並べ替えに非常に多くの時間とメモリが必要です。私はそれをできた

grep -cfx 'one possible line'

ファイル内の一意の行ごとに、ただし、これは可能な行ごとにファイルを n 回渡すことを意味します。

何か案は?


関連する質問では、大きなファイルで一意の行を見つける方法について尋ねられますが、それぞれのインスタンスの数を数える方法を探しています-可能な行が何であるかはすでに知っています.

4

3 に答える 3

10

使用するawk

awk '{c[$0]++} END {for (line in c) print c[line], line}' bigfile.txt

これは時間で O(n)、空間で O(unique lines) です。

于 2015-09-02T22:31:26.017 に答える
3

これはjq 1.5を使用したソリューションです。アプローチとパフォーマンスの特性の両方で awk ソリューションと本質的に同じですが、出力はハッシュを表す JSON オブジェクトです。(プログラムを簡単に変更して、別の形式で出力を生成することができます。)

呼び出し:

$ jq -nR 'reduce inputs as $line ({}; .[$line] += 1)' bigfile.txt

bigfile.txt が次の行で構成されている場合:

a
a
b
a
c

出力は次のようになります。

{
  "a": 3,
  "b": 1,
  "c": 1
}
于 2015-09-03T16:04:28.763 に答える