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's
shuf
0..3494-1