У меня есть две параллельные тела (текстовые файлы) с выравниванием по предложениям, содержащие около 50 миллионов слов. (из Europarl corpus -> параллельный перевод юридических документов). Теперь я хотел бы перемешать строки двух файлов, но оба одинаково. Я хотел подойти к этому, используя gshuf (я на Mac), используя один уникальный случайный источник.
gshuf --random-source /path/to/some/random/data file1
gshuf --random-source /path/to/some/random/data file2
Но я получил сообщение об ошибке end of file
, потому что, очевидно, случайное начальное число должно содержать все слова, которые содержит файл для сортировки. Это правда? Если да, то как мне создать случайное семя, подходящее для моих нужд? Если нет, каким образом можно параллельно рандомизировать файлы? Я думал о склеивании их, рандомизации и последующем разделении. Тем не менее, это кажется уродливым, так как мне нужно было бы сначала найти разделитель, который не встречается в файлах.
источник
random sources
. Что касаетсяpaste
, вы можете использовать в качестве разделителя какой-нибудь символ низкого качества, который вряд ли будет встречаться в ваших файлах (например\x02
,\x03
...).Ответы:
Я не знаю, есть ли более элегантный метод, но это работает для меня:
Результат:
Но файлы должны иметь одинаковое количество строк.
Документация GNU Coreutils также предоставляет отличное решение для повторяющихся случайностей с использованием
openssl
генератора случайных чисел:Тем не менее, рассмотрите возможность использования лучшего семени, чем «42», если только вы не хотите, чтобы кто-либо еще мог воспроизвести «ваш» случайный результат.
источник
end of file
ошибка не возникает?/dev/null
потому, чтоtee
также печатаетstdout
. Можно использовать> threerandom
вместо этого, но это сложнее для сценария. Именованные каналы будут генерировать столько случайных данных, сколько необходимо, поэтому вам не нужно заранее знать, сколько вам понадобится.tee
делает ...