Red Hat Linux에서 표준 도구를 사용하여 파일의 행을 무작위 화하려면 어떻게해야합니까?
나는 shuf
명령이 없기 때문에 동일한 작업을 수행하는 한 줄짜리 perl
또는 awk
한 줄짜리를 찾고 있습니다.
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
테스트되지 않았지만 잘 작동합니다.
ruby -e 'puts STDIN.readlines.shuffle'
. 속도가 비슷한 지 확인하려면 큰 입력에 대한 테스트가 필요합니다. (OS X에서도 작동)
shuf
모든 것을 메모리에로드하므로 정말 큰 파일 (내는 ~ 300GB tsv)에서는 작동하지 않습니다. 이 perl 스크립트는 내에서도 실패했지만 Killed
. Perl 솔루션이 모든 것을 메모리에로드하는지, 아니면 내가 겪고있는 다른 문제가 있는지 아십니까?
음, 잊지 말자
sort --random-sort
brew install coreutils
모든 유틸리티에는 ag 접두사가 붙습니다. gsort --random-sort
또는 gshuf
예상대로 작동합니다
gsort
와 gshuf
내가 한 때 설치port install coreutils
shuf
대신 사용 을 고려하십시오 (Linux에서).
shuf
가장 좋은 방법입니다.
sort -R
고통스럽게 느립니다. 방금 5GB 파일을 정렬하려고했습니다. 나는 2.5 시간 후에 포기했다. 그런 다음 shuf
1 분 안에 정렬했습니다.
sort -R
가 느린 것은 각 줄에 대한 해시를 계산하기 때문이라고 생각합니다 . 문서에서 : " 입력 키를 해시 한 다음 해시 값을 정렬하여 정렬합니다. "
shuf
메모리에로드 다.
seq -f 'line %.0f' 1000000
하는 데 똑같이 오랜 시간 이 걸렸습니다 (를 사용하는 것보다 훨씬 더 오래 shuf
).
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
파일을 읽고, 모든 줄 앞에 임의의 숫자를 추가하고, 임의의 접두사에 따라 파일을 정렬하고, 나중에 접두사를 자릅니다. 세미 모던 쉘에서 작동 해야하는 원 라이너.
편집 : Richard Hansen의 발언을 통합했습니다.
$RANDOM
), 데이터 도축의 경우 -1입니다. 교체 while read f
로하는 while IFS= read -r f
막을 read
제거하는 선행 및 후행 공백에서 (볼 이 대답 )와 슬래시 방지 처리. 고정 길이 임의 문자열을 사용하면 cut
선행 공백이 삭제 되지 않습니다. 결과 : cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
파이썬을위한 한 줄짜리 :
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
되었기 때문에 필요 $_=<>
합니다.)
OSX에서는 http://ftp.gnu.org/gnu/coreutils/ 등에서 최신 정보를 가져옵니다.
./configure make sudo make install
... / usr / local / bin / sort --random-sort를 제공해야합니다.
/ usr / bin / sort를 엉망으로 만들지 않고