Выберите случайные 3000 строк из файла с кодами awk - PullRequest
4 голосов
/ 22 сентября 2011

Я хочу произвольно выбрать 3000 строк из файла sample.file, который содержит 8000 строк. Я сделаю это с помощью кодов awk или из командной строки. Как я могу это сделать?

Ответы [ 8 ]

9 голосов
/ 11 июля 2014

Если у вас есть сортировка по GNU, это просто:

sort -R FILE | head -n3000

Если у вас есть Гну Шуф, это еще проще:

shuf -n3000 FILE
4 голосов
/ 22 сентября 2011
awk 'BEGIN{srand();}
{a[NR]=$0}
END{for(i=1; i<=3000; i++){x=int(rand()*NR) + 1; print a[x];}}' yourFile
3 голосов
/ 22 сентября 2011

Исправлено в соответствии с комментарием Гленна:

awk 'BEGIN {
  a=8000; l=3000
  srand(); nr[x]
  while (length(nr) <= l) 
    nr[int(rand() * a) +  1]    
  }
NR in nr
  ' infile 

PS Передача массива во встроенную функцию длины непереносима, вы были предупреждены:)

2 голосов
/ 22 сентября 2011

Для этого вы можете использовать комбинацию awk, sort, head/tail и sed, например, с:

pax$ seq 1 100 | awk '
...$    BEGIN {srand()}
...$          {print rand() " " $0}
...$ ' | sort | head -5 | sed 's/[^ ]* //'
57
25
80
51
72

, который, как вы можете видеть, выбирает пять случайных строк из ста, сгенерированных в seq 1 100.

Трюк awk ставит перед каждой и каждой строкой файла префикс случайным числом и пробелом в формате "0.237788 ", затем сортирует (очевидно) сортирует его по этому случайному числу.

Затем вы используете head (или tail, если у вас нет head), чтобы получить первые (или последние) N строки.

Наконец, sed удалит случайное число, пробел и начало каждой строки.

Для вашего конкретного случая вы можете использовать что-то вроде (в одной строке):

awk 'BEGIN {srand()} {print rand() " " $0}' file8000.txt
    | sort
    | tail -3000
    | sed 's/[^ ]* //'
    >file3000.txt
1 голос
/ 05 июня 2013

Я использовал эти команды и получил то, что хотел:

awk 'BEGIN {srand()} {print rand() " " $0}' examples/data_text.txt | sort -n | tail -n 80 | awk '{printf "%1d %s %s\n",$2, $3, $4}' > examples/crossval.txt

, который фактически случайным образом выбирает 80 строк из входного файла.

0 голосов
/ 06 февраля 2014

Для огромного файла, который я не хотел перетасовать, это сработало хорошо и довольно быстро:

sed -u -n 'l1p; l2p; ...; l1000p; l1000q '

Опция -u уменьшает буферизацию, а l1, l2, ... l1000 - случайные и отсортированные номера строк, полученные из R (было бы так же хорошо с python или perl).

0 голосов
/ 06 февраля 2013

Если вам нужно всего лишь около 3000 строк, это простой метод:

awk -v N=`cat FILE | wc -l` 'rand()<3000/N' FILE

Часть между обратными чертами (`) дает количество строк в файле.

0 голосов
/ 22 сентября 2011

В PowerShell:

Get-Content myfile | Get-Random -Count 3000

или короче:

gc myfile | random -c 3000
...