0

| いくつかを解析する次のスクリプトがあります。区切られたフィールド/値のペア。サンプルデータは |Apple=32.23|Banana =1232.12|Grape=12312|Pear=231|Grape=1231| のようになります。

A、B、または C フィールド名がログ ファイルに表示される回数を数えようとしています。フィールド リストは動的である必要があります。ログ ファイルはそれぞれ約 500 MB と「大きい」ため、各ファイルを並べ替えるには時間がかかります。カットを行って、1 行に 1 つのフィールドを持つファイルを取得したら、カウントを行うより高速な方法はありますか?

 cat /bb/logs/$dir/$file.txt | tr -s "|" "\n" | cut -d "=" -f 1 | sort | uniq -c > /data/logs/$dir/$file.txt.count

私は、この部分が高速に実行されることを知っています。並べ替えで行き詰まることが確実にわかります。

cat /bb/logs/$dir/$file.txt | tr -s "|" "\n" | cut -d "=" -f 1 

カットを実行した後、サンプル出力を以下に示します。もちろん、ファイルははるかに長くなります

Apple
Banana
Grape
Pear
Grape

並べ替えとカウントの後、私は得る

 1 Apple
 1 Banana 
 1 Pear
 2 Grape

問題は、実際のデータの並べ替えに時間がかかりすぎることです。> カットをファイルに出力する方が速いと思いますが、「大きな」テキスト ファイル内の一意のエントリをカウントする最速の方法はわかりません

4

1 に答える 1

3

AWK は、ソートせずにうまく処理できます。これを試してみると、パフォーマンスが向上するはずです。

cat test.txt | tr -s "|" "\n" | cut -d "=" -f 1 |
   awk '{count[$1]++}END{for(c in count) print c,"found "count[c]" times."}' 
于 2012-03-07T21:35:56.560 に答える