9

У меня есть текстовый файл ~ 1 ГБ с около 6 тыс. Строк (каждая строка очень длинная), и мне нужно случайным образом перемешать его строки. Является ли это возможным? Возможно с awk?

6 ответов6

17

Вы можете использовать команду shuf из GNU coreutils. Утилита работает довольно быстро и займет не более минуты для перетасовки файла размером 1 ГБ.

Команда ниже может просто работать в вашем случае, потому что shuf прочитает весь ввод перед открытием выходного файла:

$ shuf -o File.txt < File.txt
4

Python однострочный:

python -c 'import sys, random; L = sys.stdin.readlines(); random.shuffle(L); print "".join(L),'

Читает все строки из стандартного ввода, перетасовывает их на месте, затем печатает их, не добавляя завершающий перевод строки (обратите внимание на , с конца).

1

Если, как и я, вы пришли сюда, чтобы найти альтернативу shuf для macOS, то используйте randomize-lines .

Установите пакет randomize-lines(homebrew), который имеет команду rl , аналогичную функциональности shuf .

brew install randomize-lines

Usage: rl [OPTION]... [FILE]...
Randomize the lines of a file (or stdin).

  -c, --count=N  select N lines from the file
  -r, --reselect lines may be selected multiple times
  -o, --output=FILE
                 send output to file
  -d, --delimiter=DELIM
                 specify line delimiter (one character)
  -0, --null     set line delimiter to null character
                 (useful with find -print0)
  -n, --line-number
                 print line number with output lines
  -q, --quiet, --silent
                 do not output any errors or warnings
  -h, --help     display this help and exit
  -V, --version  output version information and exit
0

Для OSX бинарный файл называется gshuf .

brew install coreutils
gshuf -o File.txt < File.txt
0

Я забыл, где я нашел это, но вот shuffle.pl который я использую:

#!/usr/bin/perl -w

# @(#) randomize Effectively _unsort_ a text file into random order.
# 96.02.26 / drl.
# Based on Programming Perl, p 245, "Selecting random element ..."

# Set the random seed, PP, p 188
srand(time|$$);

# Suck in everything in the file.
@a = <>;

# Get random lines, write 'em out, mark 'em done.
while ( @a ) {
        $choice = splice(@a, rand @a, 1);
        print $choice;
}
0

По крайней мере, в Ubuntu есть программа под названием shuf

shuf file.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .