4

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

2 ответа2

4

Если вы используете разумный новый дистрибутив 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 .

1

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

#!/usr/bin/python

import random

#Change these to the desired files
infile = "/path/to/input/file"
outfile = "/path/to/output/file"

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

chunked = [contents[i:i+4] for i in xrange(0, len(contents), 4)]
random.shuffle(chunked)

fh = file(outfile, 'w')

for chunk in chunked:
    for line in chunk:
        fh.write(line)

fh.close()

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

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