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

Проблема в том, что ваш ModelState повторно заполняется опубликованными значениями.

То, что вы можете сделать, это очистить его в действии, которое имеет атрибут Post:

ModelState.Clear();
96
задан mklement0 8 May 2015 в 22:06
поделиться

4 ответа

И вы получите однострочник 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

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

62
ответ дан 24 November 2019 в 05:30
поделиться

Хм, не забывайте

sort --random-sort
205
ответ дан 24 November 2019 в 05:30
поделиться

Относится к ответу Джима:

Мой ~ / .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 необходимо, потому что $ _ = <> неявно было выполнено с целым файл вместо строк.)

5
ответ дан 24 November 2019 в 05:30
поделиться
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-

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

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

22
ответ дан 24 November 2019 в 05:30
поделиться
Другие вопросы по тегам:

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