Относится к ответу Джима:
My ~/.bashrc
содержит следующее:
unsort ()
{
LC_ALL=C sort -R "$@"
}
С сортировкой GNU coreutils, -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
необходим, потому что $_=<>
неявно сделано с целым файлом вместо строк.)