Как эффективно перетасовать большие текстовые файлы во время передачи их в Linux?

1795
yarun can

У меня есть текстовый файл, который составляет пару ГБ. Я пытаюсь перетасовать этот текстовый файл в трубу.

Например, это некоторые примеры строк того, что я использую, но это неэффективно, и на самом деле канал не запускается, пока не будет прочитан весь файл. Может быть, я ошибаюсь в этом.

shuf HUGETEXTFILE.txt|some command  cat HUGETEXTFILE.txt|sort -R |some command 

Я также пытался использовать

split -n 1/numberofchunks HUGETEXTFILE.txt|sort -R|some command 

Но трубопровод заканчивается, когда заканчивается первый кусок.

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

Спасибо

0
Вы пытались использовать `shuf --input-range = $ LO- $ HI`? Вместо `split ...` вы можете дать `shuf` диапазон в белье ... Hastur 10 лет назад 0
Ну, я пытаюсь перетасовать весь файл сразу, если это возможно. Это звучит так, как будто бы он перетасовал диапазон из входного файла. yarun can 10 лет назад 0
также этот аргумент просто создает кучу случайных чисел, я не уверен, что это то, что мне нужно. Можете ли вы быть более сложным, пожалуйста? yarun can 10 лет назад 0
Вы пытались использовать shuf с параметром --output, затем с помощью cat outfile.txt | какая-то команда. Я знаю, что вы сказали, что не хотите писать сотни файлов, но это только один, и имя можно восстановить, то есть у вас должен быть только один. Tyson 10 лет назад 0
Вы знаете, что просто не существует «эффективного» способа перестановки текстового файла размером в несколько ГБ (т. Е. Файла, который не помещается в ОЗУ) - перестановка является по своей сути дорогостоящей операцией. Eugen Rieck 10 лет назад 0
@Eugen Rieck, я не против, если он будет разбит на несколько сценариев. Я просто не хочу иметь дело со многими сотнями файлов, если это возможно. yarun can 10 лет назад 0

1 ответ на вопрос

0
Ruslan Gerasimov

Вы можете попробовать этот подход:

cat bigfile.txt| while IFS= read -r line; do echo '%s\n' "$line" |shuf |sort -n| grep "sample"; done 

IFS используется для разделения вывода на строки здесь.

Похожие вопросы