패턴을 기반으로 N개 행의 무작위 샘플을 추출합니다.

패턴을 기반으로 N개 행의 무작위 샘플을 추출합니다.

다음 형식의 파일이 있습니다.

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

관련 정보