다음 형식의 파일이 있습니다.
train/t/temple/east_asia/00000025.jpg 94
train/t/temple/east_asia/00000865.jpg 94
...
train/s/swamp/00000560.jpg 92
train/s/swamp/00000935.jpg 92
....
train/m/mountain/00000428.jpg 68
train/m/mountain/00000126.jpg 68
마지막 숫자는 학번입니다. 각각 1,000개의 행이 있는 50개의 서로 다른 클래스가 있습니다. 각 클래스에서 크기 N의 샘플을 무작위로 추출하고 결과를 다른 텍스트 파일에 저장하고 싶습니다.
답변1
라인이 클래스별로 그룹화되어 있으므로 ( gnu
도구를 사용하여) split
파일을 여러 부분으로 분할하고 --fiter
옵션을 사용하여 각 부분을 파이프 할 수 shuf
있습니다.질소그 안에 있는 임의의 줄:
분할 --filter='shuf -n질소'내부파일>외부파일
기본값 split
은 1000개 행입니다. 이는 이 특별한 경우에 필요한 것입니다. 요구 사항이 변경되면 행 수를 전달해야 합니다. 예를 들어 -l
이를 200개 행으로 분할하고 각 행에서 무작위로 30개 행을 가져와야 합니다.
split -l 200 --filter='shuf -n 30' infile > outfile
답변2
awk
이 작업을 수행하려면 명령을 한 번만 호출하면 됩니다.
n=1000개 행마다 p=50개 행을 무작위로 선택합니다.
awk -v n=1000 -v p=50 '
BEGIN {srand(); remaining = p}
NR > n {remaining = p; NR = 1}
rand()*(n + 1 - NR) < remaining {
print; remaining--
}' < your-file