2

sort処理できないと思われるファイルを処理する必要があります。ファイルは約です。それぞれ3GB。

入力は次のとおりです。

last-j  nmod+j+n    year-n 9492
last-j  nmod+j+n    night-n 8075
first-j nmod+j+n-the    time-n 7749
same-j  nmod+j+n-the    time-n 7530
other-j nmod+j+n-the    hand-n 5319
ast-j   nmod+j+n   year-n 1000
last-j   nmod+j+n   night-n 5000
first-j   nmod+j+n-the   time-n 1000
same-j   nmod+j+n-the   time-n 3000
other-j   nmod+j+n-the   hand-n 200

対応する重複の数を合計する必要があります。

したがって、望ましい出力は次のようになります。

   last-j   nmod+j+n    year-n 10492
    last-j  nmod+j+n    night-n 13075
    first-j nmod+j+n-the    time-n 8749
    same-j  nmod+j+n-the    time-n 10530
    other-j nmod+j+n-the    hand-n 5519

私はこのソートコマンドを試してみましたが、これでうまくいくはずです

sort input | uniq -c | awk '{print $2 "\t" $3 "\t" $1*$4}' 

そしてメモリ不足です。より大きなデータファイルを処理するために、もう少し最適化されている可能性のある何かについての提案はありますか?? ありがとう

4

3 に答える 3

2

sortおよびその他の純粋に魔法の UNIX ツールは、おそらく可能な限り最適化されています。ファイル内のエントリを数えていて、それらの一意の出現がメモリに収まらない場合、それらをメモリにロードすることは適切な解決策ではありません。それ以外の場合、これが最速のアプローチです。

これとは別に、ファイルを並べ替え -- O(n log n)-- 、後でエントリを数えること -- O(n)-- が確かに最良の解決策です --kエントリの -size マップをメモリに保持し、メモリからディスクへのデータのスワップを続けない限りk + 1キーがマップに追加されようとするたびに。これを考慮すると、ソリューション ( のワンライナーsort + uniq + awk) は少しタップするだけで済みます。

の魔法の能力をsort使用して、外部からファイルにアクセスしてみてください。sortその後、カウントには最大で1つのエントリをメモリに保持する必要があります-これで問題はほとんど解決されます。最後の 2 ライナーは次のようになります。

sort -T <directory_for_temp_files> <input> > <output>
awk '{
    if (cur == "$1 $3") { freq += $4; }
    else { printf "%s %d\n", cur, freq; cur = "$1 $3"; freq = $4; }
}' < <output> > <final_output>
于 2013-11-07T10:09:38.357 に答える
2

で配列を使用するawkと、すべてをまとめて実行できます。 and の必要はありませsortuniq

$ awk '{a[$1,$2,$3]+=$4} END{for (i in a) print i, a[i]}' file
first-jnmod+j+n-thetime-n 8749
ast-jnmod+j+nyear-n 1000
same-jnmod+j+n-thetime-n 10530
last-jnmod+j+nnight-n 13075
last-jnmod+j+nyear-n 9492
other-jnmod+j+n-thehand-n 5519

これは、col 1、2、3 をインデックスとして使用しているため、それらはまとめて書き込まれます。これは、それらを別の配列に入れることで解決できます。

$ awk '{a[$1,$2,$3]+=$4; b[$1,$2,$3]=$1" "$2" "$3} END{for (i in a) print b[i], a[i]}' a
first-j nmod+j+n-the time-n 8749
ast-j nmod+j+n year-n 1000
same-j nmod+j+n-the time-n 10530
last-j nmod+j+n night-n 13075
last-j nmod+j+n year-n 9492
other-j nmod+j+n-the hand-n 5519
于 2013-11-07T09:52:30.737 に答える