Вопрос Как я произвольно сортировать группы из нескольких строк в файле с несколькими GB?


У меня есть файл с несколькими GB, в котором есть элементы в 4 строках, и я хотел бы, чтобы каждые 4 строки были рандомизированы в другом файле, это означает, что каждая из четырех строк группируется и рандомизирует эти множества. Есть ли простой способ сделать это?


4
2017-07-01 10:56


происхождения


Вы хотите, чтобы четыре строки были сгруппированы и рандомизированы на этих наборах, или вы хотите рандомизировать четыре строки, но сохранить группы в порядке? - Patches
сохранить каждую группу из четырех строк, сгруппированных - 719016


ответы:


Если вы используете разумный новый дистрибутив linux / unix, sort поставляется с -R флаг, который рандомизирует строки вместо их сортировки. Мы можем использовать это для создания этого однострочного решения:

awk '{printf("%s%s",$0,(NR%4==0)?"\n":"\0")}' file.txt | sort -R | tr "\0" "\n" > sorted.txt

Во-первых, используйте awk группировать каждые 4 строки, заменяя \n с \0, Затем мы перетасовываем строки, используя sort -R и, наконец, восстановить разрывы строк с помощью tr,


4
2017-08-26 16:42



"\n не закрывается и "\n", Я не могу сделать такое маленькое редактирование, поэтому я просто помещаю его сюда. - Ian Hunter
Кроме того, по какой-то причине в моей системе я не мог напечатать «\ 0» и заставить его заменить должным образом. Вместо этого я использовал printf("%s%c",$0,(NR%4==0)?"\n":0), Мне не нужно было менять команду tr. - Ian Hunter


Это в Python. Я уверен, что кто-то отправит ответ на Perl тоже. ;-)

#! / USR / бен / питон

импортировать случайные

# Измените их на нужные файлы
infile = "/ path / to / input / file"
outfile = "/ path / to / output / file"

fh = file (infile)
content = fh.readlines ()
fh.close ()

chunked = [содержимое [i: i + 4] для i в xrange (0, len (содержимое), 4)]
random.shuffle (фрагментированное)

fh = файл (outfile, 'w')

для куска в chunked:
    для строки в куске:
        fh.write (линия)

fh.close ()

IANA Programmer, чтобы кто-то мог, возможно, улучшить это, но я тестировал его, и он работает отлично.


1
2017-07-01 12:53