[linux] 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'

제자리에서 파일을 섞습니다. ( -n은 “코드를 while (<>) {...}루프로 래핑합니다 . BEGIN{undef$/}Perl이 한 번에 한 줄씩 대신 파일 한 번에 작동하도록 만들고 줄 대신 전체 파일로 암시 적으로 수행 split/^/m되었기 때문에 필요 $_=<>합니다.)


답변

homebrew로 coreutils를 설치할 때

brew install coreutils

shuf으로 사용할 수 있습니다 n.