![카테고리에 따라 무작위로 텍스트 파일을 반으로 나눕니다.](https://linux55.com/image/86428/%EC%B9%B4%ED%85%8C%EA%B3%A0%EB%A6%AC%EC%97%90%20%EB%94%B0%EB%9D%BC%20%EB%AC%B4%EC%9E%91%EC%9C%84%EB%A1%9C%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EB%B0%98%EC%9C%BC%EB%A1%9C%20%EB%82%98%EB%88%95%EB%8B%88%EB%8B%A4..png)
다음과 같은 텍스트 파일이 있습니다.
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
명령으로 생성된 파일 이름이라고 가정합니다.