Как я могу рандомизировать строки в файле с помощью стандартных инструментов в Red Hat Linux?

Как я могу рандомизировать строки в файле с помощью стандартных инструментов в Red Hat Linux?

У меня нет команды shuf, поэтому я ищу что-то вроде однострочного perl или awk, который выполняет ту же задачу.

Ответ 1

И один лайнер Perl, который вы получаете!

perl -MList::Util -e 'print List::Util::shuffle <>'

Он использует модуль, но модуль является частью дистрибутива кода Perl. Если это не достаточно хорошо, вы можете подумать о том, чтобы кататься самостоятельно.

Я попытался использовать это с флагом -i ( "edit-in-place" ), чтобы он редактировал файл. Документация предполагает, что она должна работать, но это не так. Он по-прежнему отображает перетасованный файл в stdout, но на этот раз он удаляет оригинал. Я предлагаю вам не использовать его.

Рассмотрим оболочку script:

#!/bin/sh

if [[ $# -eq 0 ]]
then
  echo "Usage: $0 [file ...]"
  exit 1
fi

for i in "[email protected]"
do
  perl -MList::Util -e 'print List::Util::shuffle <>' $i > $i.new
  if [[ `wc -c $i` -eq `wc -c $i.new` ]]
  then
    mv $i.new $i
  else
    echo "Error for file $i!"
  fi
done

Неподтвержденный, но, надеюсь, работает.

Ответ 2

Um, не забывайте

sort --random-sort

Ответ 3

"shuf" - лучший способ

"sort -R" очень медленный. Я просто попытался отсортировать файл размером 5 ГБ. Я сдался через 2,5 часа. Затем Шуф разобрал его через минуту.

Ответ 4

cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-

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

РЕДАКТИРОВАНИЕ: включены замечания Ричарда Хансена.

Ответ 5

Один слой для python:

python -c "import random, sys; lines = open(sys.argv[1]).readlines(); random.shuffle(lines); print ''.join(lines)," myFile

И для печати только одной случайной строки:

python -c "import random, sys; print random.choice(open(sys.argv[1]).readlines())," myFile

Но см. этот пост за недостатки python random.shuffle(). Это не сработает со многими (более 2080) элементами.

Ответ 6

Относительно ответа Джима:

My ~/.bashrc содержит следующее:

unsort ()
{
    LC_ALL=C sort -R "[email protected]"
}

С GNU coreutils sort, -R= --random-sort, который генерирует случайный хэш каждой строки и сортируется по нему. Рандомизированный хеш на самом деле не использовался бы в некоторых локалях в некоторых более старых (багги) версиях, заставляя его возвращать нормальный сортированный вывод, поэтому я устанавливал LC_ALL=C.


Относительно ответа Криса:

perl -MList::Util=shuffle -e'print shuffle<>'

- несколько более короткий однострочный. (-Mmodule=a,b,c является сокращением для -e 'use module qw(a b c);'.)

Причина предоставления простой -i не работает для перетасовки на месте, потому что Perl ожидает, что print происходит в том же цикле, когда файл читается, а print shuffle <> не выводится до тех пор, пока после того, как все входные файлы были прочитаны и закрыты.

В качестве более короткого временного решения

perl -MList::Util=shuffle -i -ne'BEGIN{undef$/}print shuffle split/^/m'

будет перемешать файлы на месте. (-n означает "обернуть код в цикле while (<>) {...}; BEGIN{undef$/} заставляет Perl работать с файлами по времени, а не по строкам, а split/^/m требуется, потому что $_=<> было неявно сделано с целым файлом вместо строк.)

Ответ 7

Когда я устанавливаю coreutils с homebrew

brew install coreutils

shuf становится доступным как n.

Ответ 8

Mac OS X с DarwinPorts:

sudo port install unsort
cat $file | unsort | ...

Ответ 9

FreeBSD имеет свою собственную случайную утилиту:

cat $file | random | ...

Это в /usr/games/random, поэтому, если вы не установили игры, вам не повезло.

Вы можете рассмотреть возможность установки портов, таких как textproc/rand или textproc/msort. Они могут быть доступны в Linux и/или Mac OS X, если переносимость является проблемой.

Ответ 10

В OSX, захватывая последние из http://ftp.gnu.org/gnu/coreutils/ и что-то вроде

./настроить делать sudo make install

... должен предоставить вам /usr/local/bin/sort --random-sort

без помех/usr/bin/sort

Ответ 11

Или получить его из MacPorts:

$ sudo port install coreutils

и/или

$ /opt/local//libexec/gnubin/sort --random-sort