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 시간 후에 포기했다. 그런 다음 shuf
1 분 안에 정렬했습니다.
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
'Programming' 카테고리의 다른 글
Asp.NET Web API-405-이 페이지에 액세스하는 데 사용되는 HTTP 동사가 허용되지 않음-처리기 매핑 설정 방법 (0) | 2020.08.25 |
---|---|
소수점 이하 숫자를 얻는 방법? (0) | 2020.08.25 |
Android TextView에서 HTML 목록 태그가 작동하지 않습니다. (0) | 2020.08.25 |
세 번째 변수를 사용하지 않고 두 변수 값 바꾸기셸에서 가비지 수집을 어떻게 강제합니까? (0) | 2020.08.25 |
텍스트를 변경할 때마다 UITextView를 맨 위로 스크롤하려면 어떻게해야합니까? (0) | 2020.08.25 |