짧은 문장(몇 단어 길이)이 포함된 큰 텍스트 파일(~500,000줄)이 있습니다. 또한 대부분의 행에는 일부 XML 태그가 있습니다. 마지막으로 텍스트 파일이 정렬됩니다.앞으로태그가 추가되었습니다! XML 태그를 추가하면 알파벳 순서가 변경되지만 이는 필수입니다.
내 질문은 다음과 같습니다소스 파일 순서대로 임의의 줄을 인쇄하는 방법은 무엇입니까?
shuf 명령을 사용하여 결과를 정렬할 수 있다는 것을 알고 있습니다. 문제는 태그가 정렬을 엉망으로 만든다는 것입니다.
또한 python
텍스트 파일을 목록에 로드하고, 임의의 숫자를 생성하고, 이를 정렬하고, 행을 가져오는 인덱스로 사용하는 스크립트를 작성할 수도 있습니다. 가능하다면 표준 *nix 명령줄 도구를 선호합니다.
견본:
<CITY>anaconda</CITY> city is in <STATE>montana</STATE>
let's go to <CITY>rome</CITY>
please find <CITY>berlin</CITY>
where is <CITY>cairo</CITY> in <COUNTRY>egypt</COUNTRY>
2호선과 3호선을 뽑아낼 수 있으면 정말 좋을 것 같아요. 1,3,4호선도 좋습니다. 행 3, 1, 4를 얻으면 그것은 좋지 않습니다.
답변1
이것을 사용하십시오 :
nl file | shuf -n2 | sort -n | cut -f2-
nl
행에 번호를 매기고,shuf
순서를 섞고 출력을 2줄로 제한합니다(-n
).sort
원래 순서를 복원하고,cut
count 을 제거 하십시오nl
.
파일의 2줄을 원래 순서대로 인쇄합니다. 를 사용하세요 shuf -n X
. X
임의의 숫자가 될 수 있습니다.
답변2
Donald E. Knuth의 The Art of Computer 프로그래밍, 2권, 섹션 3.4.2에서는 정렬하지 않고(행이 몇 개인지 알지 못한 채) 파일에서 임의의 행을 선택하는 방법을 다룹니다. 이는 구현하기가 간단합니다. 예를 들면 다음과 같습니다.
(echo foo; echo bar; echo zot) \
| perl -nle 'rand $. < 1 && ( $line = $_ ); END { print $line }'
shuf
또는 Knuth 알고리즘을 선택하는 것보다 더 많은 메모리가 필요할 수 있지만 특정 수의 행을 선택할 수 있는 를 시도해 보십시오 .
답변3
다음과 같이 while 루프와 $RANDOM을 사용하여 이 작업을 수행할 수 있습니다.
while read line; do
if ((RANDOM%2)); then
echo $line;
fi;
done < _path_
이렇게 하면 줄의 절반 정도가 인쇄됩니다. 조건에서 컨트롤을 사용할 수 있습니다.if