파일을 무작위로 부분 집합화한 다음 여러 파일에서 동일한 줄 번호를 선택하는 방법

파일을 무작위로 부분 집합화한 다음 여러 파일에서 동일한 줄 번호를 선택하는 방법

3494개의 줄이 포함된 파일이 있고 그 중 100개를 무작위로 선택하여 해당 줄을 새 파일에 쓰고 싶습니다. 나는 이것을 사용하여 그것을 할 수 있습니다 :

shuf -n 100 input_file.txt output_file.txt

그러나 그러한 입력 파일이 많으므로 각 파일에서 동일한 100줄을 선택하고 싶습니다. 즉, 첫 번째 파일 선택의 행 인덱스를 유지 shuf하고 다른 파일에서도 동일한 행을 선택해야 합니다. 어떻게 해야 하나요?

편집하다:

첫 번째 답변은 도움이 되었지만 여전히 올바른 파일에서 선택할 수 없습니다. 동일한 100줄을 선택하려는 파일이 10개 있습니다. 결국 1100개의 행이 생겼습니다.

답변1

먼저 3494에서 100개의 난수를 추출한 다음 각 파일에서 해당 줄 번호를 추출할 수 있습니다.

seq 3494 | shuf -n 100 | awk 'NR==FNR{ z[$0]++;next}
{if (FNR in z){ print >FILENAME"_random"}}' - ./*.txt

그러면 각 파일에서 동일한 줄 번호가 추출되어 다음 위치에 저장됩니다.FILENAME"_random"

답변2

sed다음과 같이 특정 인덱스의 행을 인쇄하는 간단한 스크립트 파일을 만들 수 있습니다 .

printf '%dp\n' $(shuf -i 1-3494 -n 100) > indexfile

그런 다음 이렇게 사용하십시오

sed -nf indexfile File1
sed -nf indexfile File2
.
.

등. GNU가 있는 경우 다음을 sed사용 -s, --separate하여 여러 파일에서 동일한 줄을 순차적으로 선택할 수 있습니다.

sed -snf indexfile File1 File2 File3

( File1 File2 File3원하는 경우 쉘 글로브로 교체할 수 있습니다.)

각 호출에서 서로 다른 무작위 하위 집합을 선택하는 단일 코드 줄을 원할 경우 다음과 같이 할 수 있습니다.

printf '%dp\n' $(shuf -i 1-3494 -n 100) | sed -snf - File1 File2 File3

답변3

perl -ls0777ne 'print for(split $\)[split $\,$r]' -- -r="$(shuf -i 0-3493 -n 100)" -- ./*.txt

r="$(shuf -i 0-3493 -n 5)" \
perl -l -0777ne 'print for(split $\)[split $\,$ENV{r}]' ./*.txt

무작위 조합이 생성되어 Perl명령줄을 통해 전달되므로 모든 파일이 동일한 무작위 순서를 갖게 됩니다. 그런 다음 slurped각 파일을 구성하여 한 번에 분할하고 선택합니다. 인덱싱은 0부터 시작하므로 다음 명령이 제공됩니다.newline@A[...]Perl'sshuf0..3494-1

관련 정보