Programming

Red Hat Linux에서 표준 도구를 사용하여 파일의 행을 무작위 화하려면 어떻게해야합니까?

procodes 2020. 8. 25. 20:47
반응형

Red Hat Linux에서 표준 도구를 사용하여 파일의 행을 무작위 화하려면 어떻게해야합니까?


Red Hat Linux에서 표준 도구를 사용하여 파일의 행을 무작위 화하려면 어떻게해야합니까?

나는 shuf명령이 없기 때문에 동일한 작업을 수행하는 한 줄짜리 perl또는 awk한 줄짜리를 찾고 있습니다.


그리고 Perl 한 줄짜리도 얻을 수 있습니다!

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

모듈을 사용하지만 모듈은 Perl 코드 배포의 일부입니다. 그것으로 충분하지 않다면, 당신은 자신의 롤링을 고려할 수 있습니다.

-i파일을 편집하기 위해 플래그 ( "edit-in-place") 와 함께 사용하려고 했습니다. 문서는 작동해야한다고 제안하지만 작동하지 않습니다. 여전히 셔플 된 파일을 stdout에 표시하지만 이번에는 원본을 삭제합니다. 사용하지 않는 것이 좋습니다.

쉘 스크립트를 고려하십시오.

#!/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

테스트되지 않았지만 잘 작동합니다.


음, 잊지 말자

sort --random-sort

shuf 가장 좋은 방법입니다.

sort -R고통스럽게 느립니다. 방금 5GB 파일을 정렬하려고했습니다. 나는 2.5 시간 후에 포기했다. 그런 다음 shuf1 분 안에 정렬했습니다.


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

파일을 읽고, 모든 줄 앞에 임의의 숫자를 추가하고, 임의의 접두사에 따라 파일을 정렬하고, 나중에 접두사를 자릅니다. 세미 모던 쉘에서 작동 해야하는 원 라이너.

편집 : Richard Hansen의 발언을 통합했습니다.


파이썬을위한 한 줄짜리 :

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

그러나 볼 이 게시물을 파이썬의의 단점에 대해 random.shuffle(). 많은 (2080 개 이상의) 요소에서 잘 작동하지 않습니다.


Jim의 답변과 관련이 있습니다.

내에 ~/.bashrc는 다음이 포함됩니다.

unsort ()
{
    LC_ALL=C sort -R "$@"
}

GNU coreutils의 정렬 -R= --random-sort를 사용하면 각 줄의 임의의 해시를 생성하고 정렬합니다. 무작위 화 된 해시는 일부 이전 (버기) 버전의 일부 로케일에서 실제로 사용되지 않아 정상적인 정렬 된 출력을 반환하게되므로 LC_ALL=C.


Chris의 답변과 관련이 있습니다.

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'

will shuffle files in-place. (-n means "wrap the code in a while (<>) {...} loop; BEGIN{undef$/} makes Perl operate on files-at-a-time instead of lines-at-a-time, and split/^/m is needed because $_=<> has been implicitly done with an entire file instead of lines.)


When I install coreutils with homebrew

brew install coreutils

shuf becomes available as n.


Mac OS X with DarwinPorts:

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

FreeBSD has its own random utility:

cat $file | random | ...

It's in /usr/games/random, so if you have not installed games, you are out of luck.

You could consider installing ports like textproc/rand or textproc/msort. These might well be available on Linux and/or Mac OS X, if portability is a concern.


On OSX, grabbing latest from http://ftp.gnu.org/gnu/coreutils/ and something like

./configure make sudo make install

...should give you /usr/local/bin/sort --random-sort

without messing up /usr/bin/sort


Or get it from MacPorts:

$ sudo port install coreutils

and/or

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

참고URL : https://stackoverflow.com/questions/886237/how-can-i-randomize-the-lines-in-a-file-using-standard-tools-on-red-hat-linux

반응형