最大値をランダムにサンプリングして出力します。

最大値をランダムにサンプリングして出力します。

私はかなり大きなデータセット〜5億行を持っています。データセットは以下の通りです。列1は浮動小数点数、列2はmac id(デバイスID)です。

1616.93,ac:22:0b:a6:22:c3
2872.32,c0:bd:d1:36:bb:49
3314.55,d4:0b:1a:39:19:b2
2854.11,18:f6:43:64:81:67
3540.68,18:f6:43:64:81:67
3856.91,ac:22:0b:a6:22:c3
2497.93,d4:0b:1a:39:19:b2

この問題は、列2をグループ化してから約100,000個のランダムサンプルを出力し、その特定のグループの列1で最大値を見つけることが必要です。

中間出力は次のとおりです(col1でグループ化)。

1616.93,ac:22:0b:a6:22:c3
3856.91,ac:22:0b:a6:22:c3
2854.11,18:f6:43:64:81:67
3540.68,18:f6:43:64:81:67
2872.32,c0:bd:d1:36:bb:49
3314.55,d4:0b:1a:39:19:b2
2497.93,d4:0b:1a:39:19:b2

その後、グループ化された各列の最大値が必要です。出力は次のとおりです。

3856.91,ac:22:0b:a6:22:c3
3540.68,18:f6:43:64:81:67
2872.32,c0:bd:d1:36:bb:49
3314.55,d4:0b:1a:39:19:b2

最後のステップは本当にランダムなサンプルを得ることです。出力は次のとおりです。

3540.68,18:f6:43:64:81:67
2872.32,c0:bd:d1:36:bb:49

これを行う方法についてのアイデアがあります。私はちょうどLinuxを使い始めましたが、これは難しいことをする方法がわかりません。どんな助けでも大変感謝します。

ベストアンサー1

努力する

BEGIN { srand() ;r=0 ; FS="," ; before="" ; }
{ if ( $1 > V[$2]) V[$2]=$1 ;
    if ( before != $2 && before != ""  ) {
          r=rand()*100 ;
       if ( r  > 50 ) printf "%s,%s\n",V[before],before ;
        }
 before=$2 ;
 }  data-file.txt

どこ

  • if ( $1 > V[$2]) V[$2]=$1; macの最大値を取得します。
  • if ( before != $2 && before != "" ) {新しいmac値が表示されたとき
  • r=rand()*100 ; if ( r > 50 ) printf "%s,%s\n",V[before],before ;任意の値を計算して50%を超えると印刷します。 (5%、95%に変更可能)

おすすめ記事