Случайно перемешивать строки в большом текстовом файле


11

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

Ответы:


19

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

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

$ shuf -o File.txt < File.txt

Спасибо, я забыл упомянуть, что я на OSX, какие-нибудь эквиваленты?
ddmichael

6
@ddmichael Беги brew install coreutilsи используй /usr/local/bin/gshuf.
Lri

2
@ddmichael В качестве альтернативы для OS X вы можете использовать этот Perl one liner. Получил один из старых блогов. Сделал быстрый тест и нашел работу. cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' Я точно уверен, насколько быстро он будет бегать
Сурадж Бияни

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

Я забыл, где я нашел это, но вот 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;
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.