다음과 같은 텍스트 파일이 있습니다.
n03250847/n03250847_0.JPEG n03250847
n03250847/n03250847_1.JPEG n03250847
...
n03250847/n03250847_499.JPEG n03250847
...
n03255030/n03255030_0.JPEG n03255030
n03255030/n03255030_1.JPEG n03255030
...
n03255030/n03255030_499.JPEG n03255030
공백 뒤의 마지막 숫자는 카테고리 번호입니다. 200개의 서로 다른 카테고리가 있고 각 카테고리에는 500개의 행(0~499)이 있습니다. 이 파일을 두 부분으로 분할하고 싶습니다. 각 결과 파일에는 100개의 임의 범주가 포함되어 있습니다.
답변1
카테고리에 따라 파일을 분할하고 개별 부분에 대해 작업하는 것이 마음에 들지 않으면 다음을 수행할 수 있습니다.
split -l 500 -a 3 infile
rnd=( $(printf %s\\n x??? | shuf -n 100) )
cat "${rnd[@]}" > rand1
rm "${rnd[@]}"
cat x??? > rand2
rm x???
이는 split
파일을 각각 500줄로 구성된 200개의 조각으로 분할하고(즉, 카테고리당 하나의 조각) shuf
파일 이름을 배열에 저장하여 무작위로 100개의 조각을 선택합니다 rnd
. 그런 다음 배열에 나열된 조각을 에 병합하여 rand1
삭제하고 나머지 조각을 에 병합하여 rand2
삭제합니다. 이 솔루션에서는 파일의 행이 범주별로 그룹화되어 있으며 x???
현재 디렉터리에서 일치하는 유일한 파일 이름은 split
명령으로 생성된 파일 이름이라고 가정합니다.