Случайная выборка и вывод наибольшего значения

У меня довольно большой набор данных ~ 500 миллионов строк. Набор данных выглядит следующим образом. Col 1 – число с плавающей точкой, col 2 – идентификатор MAC (идентификатор устройства)

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 

Задача требует вывода ~ 100 000 случайных выборок после группировки col 2, а затем нахождения наибольшего значения из col 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 

После этого мне требуется наибольшее значение из каждого сгруппированного col. Результат будет выглядеть следующим образом:

 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 и не знаю, как выполнить такую ​​гигантскую задачу. Любая помощь будет оценена по достоинству.

3 Solutions collect form web for “Случайная выборка и вывод наибольшего значения”

пытаться

 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%)

500 миллионов строк – это много данных, поэтому вы можете захотеть найти более масштабируемый способ справиться с заданием. Это означает, что делать это со стандартными утилитами Linux можно.

Предполагая, что ваши данные находятся в файле с именем data.txt вы можете распечатать его на терминал с помощью cat :

 $ cat data.txt 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 

Затем этот вывод можно sort в виде опций -t ',' -k 2 . Эти параметры будут указывать sort для разделения данных с использованием запятой в качестве разделителя, а затем сортировки по значениям во втором столбце:

 $ cat data.txt | sort -t ',' -k 2 2854.11,18:f6:43:64:81:67 3540.68,18:f6:43:64:81:67 1616.93,ac:22:0b:a6:22:c3 3856.91,ac:22:0b:a6:22:c3 2872.32,c0:bd:d1:36:bb:49 2497.93,d4:0b:1a:39:19:b2 3314.55,d4:0b:1a:39:19:b2 

Для вашей следующей задачи вы хотите использовать sort с параметрами -t ',' -k 1 -r . Это будет сортировать запятую как разделитель и значение в первом столбце. -r будет сортировать в порядке уважения, давая нам самые большие записи:

 $ cat data.txt | sort -t ',' -k 1 -r 3856.91,ac:22:0b:a6:22:c3 3540.68,18:f6:43:64:81:67 3314.55,d4:0b:1a:39:19:b2 2872.32,c0:bd:d1:36:bb:49 2854.11,18:f6:43:64:81:67 2497.93,d4:0b:1a:39:19:b2 1616.93,ac:22:0b:a6:22:c3 

Затем вы захотите снова вывести вывод вышеупомянутого примера в sort , на этот раз используя опции -t ',' -k 2 -u . Как и раньше, -t ',' и -k 2 говорят сортировать, чтобы использовать второй столбец, в то время как новый параметр -u говорит сортировать, чтобы сохранить только уникальные записи.

Поскольку мы отсортировали данные по значениям в первом столбце, при поиске уникальных записей первые будут найдены. Это даст нам самое высокое значение для каждого MAC-адреса:

 $ cat data.txt | sort -t ',' -k 1 -r | sort -t ',' -k 2 -u 3540.68,18:f6:43:64:81:67 3856.91,ac:22:0b:a6:22:c3 2872.32,c0:bd:d1:36:bb:49 3314.55,d4:0b:1a:39:19:b2 

Наконец, чтобы получить случайный образец, вы можете использовать shuf с опцией -n 2 где два – сколько случайных выборок вы хотите:

 $ shuf data.txt -n 2 3856.91,ac:22:0b:a6:22:c3 3314.55,d4:0b:1a:39:19:b2 

Для записей. это, похоже, работает, ни один из других вариантов не работал

 sort -t "," -k2,2 -k1,1 -r output.txt| awk -F "," '!a[$2]++'|head -100 
Interesting Posts
Linux и Unix - лучшая ОС в мире.