Проблема в том, что ваш ModelState повторно заполняется опубликованными значениями.
То, что вы можете сделать, это очистить его в действии, которое имеет атрибут Post:
ModelState.Clear();
И вы получите однострочник Perl!
perl -MList::Util -e 'print List::Util::shuffle <>'
Он использует модуль, но он является частью дистрибутива кода Perl. Если этого недостаточно, вы можете рассмотреть возможность использования собственного.
Я пробовал использовать это с флагом -i
(«редактировать на месте»), чтобы он редактировал файл. Документация предполагает, что это должно работать, но это не так. Он по-прежнему отображает перетасованный файл в стандартный вывод, но на этот раз удаляет оригинал. Я предлагаю вам не использовать его.
Рассмотрим сценарий оболочки:
#!/bin/sh
if [[ $# -eq 0 ]]
then
echo "Usage: $0 [file ...]"
exit 1
fi
for i in "$@"
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
Непроверенный, но, надеюсь, работает.
Относится к ответу Джима:
Мой ~ / .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 'использовать модуль qw (abc);'
.)
Причина, по которой это простое - i
не работает для перетасовки на месте, потому что Perl ожидает, что print
произойдет в том же цикле, в котором читается файл, и print shuffle <>
не выводится до тех пор, пока все входные файлы не будут прочитаны и закрыты.
В качестве более короткого обходного пути
perl -MList::Util=shuffle -i -ne'BEGIN{undef$/}print shuffle split/^/m'
перетасует файлы на месте. ( -n
означает «заключить код в цикл while (<>) {...}
; BEGIN {undef $ /}
заставляет Perl работать с файлов за раз вместо строк за раз, и разделение / ^ / m
необходимо, потому что $ _ = <>
неявно было выполнено с целым файл вместо строк.)
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
Прочтите файл, добавьте к каждой строке случайное число, отсортируйте файл по этим случайным префиксам, затем удалите префиксы. Однострочный, который должен работать в любой полусовременной оболочке.
РЕДАКТИРОВАТЬ: включены замечания Ричарда Хансена.