Как я могу рандомизировать строки в файле с помощью стандартных инструментов в Red Hat Linux?
У меня нет команды shuf
, поэтому я ищу что-то вроде однострочного perl
или awk
, который выполняет ту же задачу.
Как я могу рандомизировать строки в файле с помощью стандартных инструментов в Red Hat Linux?
У меня нет команды shuf
, поэтому я ищу что-то вроде однострочного perl
или awk
, который выполняет ту же задачу.
И один лайнер 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
Неподтвержденный, но, надеюсь, работает.
Um, не забывайте
sort --random-sort
"shuf" - лучший способ
"sort -R" очень медленный. Я просто попытался отсортировать файл размером 5 ГБ. Я сдался через 2,5 часа. Затем Шуф разобрал его через минуту.
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
Прочитайте файл, добавьте каждую строку со случайным числом, отсортируйте файл на этих случайных префиксах, затем прервите его. Один слой, который должен работать в любой полусовременной оболочке.
РЕДАКТИРОВАНИЕ: включены замечания Ричарда Хансена.
Один слой для 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) элементами.
Относительно ответа Джима:
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
требуется, потому что $_=<>
было неявно сделано с целым файлом вместо строк.)
Когда я устанавливаю coreutils с homebrew
brew install coreutils
shuf
становится доступным как n
.
Mac OS X с DarwinPorts:
sudo port install unsort
cat $file | unsort | ...
FreeBSD имеет свою собственную случайную утилиту:
cat $file | random | ...
Это в /usr/games/random, поэтому, если вы не установили игры, вам не повезло.
Вы можете рассмотреть возможность установки портов, таких как textproc/rand или textproc/msort. Они могут быть доступны в Linux и/или Mac OS X, если переносимость является проблемой.
В OSX, захватывая последние из http://ftp.gnu.org/gnu/coreutils/ и что-то вроде
./настроить делать sudo make install
... должен предоставить вам /usr/local/bin/sort --random-sort
без помех/usr/bin/sort
Или получить его из MacPorts:
$ sudo port install coreutils
и/или
$ /opt/local//libexec/gnubin/sort --random-sort