В скрипте Bash я хочу выделить N случайных строк из входного файла и вывести в другой файл.
Как это может быть сделано?
bash
shell
random
text-processing
user121196
источник
источник
sort -R
поскольку он выполняет много лишней работы, особенно для длинных файлов. Вы можете использовать$RANDOM
,% wc -l
,jot
,sed -n
(а - ля stackoverflow.com/a/6022431/563329 ), и функциональные возможности Баш (массивы, команды перенаправления, и т.д.) , чтобы определить свою собственнуюpeek
функцию , которая на самом деле будет работать с файлами 5000000 строки.Ответы:
Используйте
shuf
с-n
параметром, как показано ниже, чтобы получитьN
случайные строки:источник
sort -R
?Отсортируйте файл случайным образом и выберите первые
100
строки:источник
sort
фактически сортирует одинаковые строки вместе, поэтому, если у вас могут быть повторяющиеся строки и у вас установленshuf
(инструмент gnu), лучше использовать его для этого.shuf -n
действует совершенно мгновенно.sort -R
вероятно, вариант GNU, установите GNU coreutils. Кстати,shuf
также является частью coreutils.sort -R input | head -n <num_lines>
. Входной файл был 279GB, с 2bi + строк. Не могу поделиться этим, хотя. В любом случае, дело в том, что вы можете сохранить некоторые строки в памяти с помощью случайного выбора, чтобы сделать случайный выбор того, что выводить. Сортировка будет сортировать весь файл, независимо от ваших потребностей.Ну, согласно комментарию к ответу shuf, он переставил 78 000 000 000 строк менее чем за минуту.
Вызов принят...
РЕДАКТИРОВАТЬ: я побил свой собственный рекорд
powershuf сделал это за 0,047 секунды
Причина, по которой это так быстро, хорошо, я не читаю весь файл, а просто перемещаю указатель файла 10 раз и печатаю строку после указателя.
Гитлаб Репо
Старая попытка
Сначала мне понадобился файл из 78.000.000.000 строк:
Это дает мне файл с 78 миллиардов новых строк ;-)
Теперь для части shuf:
Узким местом был процессор и не использовались несколько потоков, он закрепил 1 ядро на 100%, остальные 15 не использовались.
Python - это то, что я регулярно использую, поэтому я буду использовать это, чтобы сделать это быстрее:
Это дало мне чуть меньше минуты:
Я сделал это на Lenovo X1 extreme 2-го поколения с i9 и Samsung NVMe, что дает мне много скорости чтения и записи.
Я знаю, что это может стать быстрее, но я оставлю некоторую комнату, чтобы дать другим попробовать.
Линия счетчик источника: Лютер Блиссетт
источник