소스 파일의 순서를 존중하여 임의의 줄을 인쇄합니다.

소스 파일의 순서를 존중하여 임의의 줄을 인쇄합니다.

짧은 문장(몇 단어 길이)이 포함된 큰 텍스트 파일(~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원래 순서를 복원하고,
  • cutcount 을 제거 하십시오 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

관련 정보