많은 파일이 포함된 디렉토리가 있습니다. 각 파일에서 무작위 샘플을 가져와서 무작위 샘플을 가져온 파일과 동일한 파일 이름을 가진 새 디렉터리에 복사하고 싶습니다.
답변1
mkdir -p random_samples
find dir -type f -exec sh -c 'for n do sort -R "$n" | head >"random_samples/${n##*/}"; done' sh {} +
그러면 그 안이나 그 아래에 있는 모든 일반 파일을 찾아 dir
이에 대해 짧은 쉘 스크립트를 실행합니다.
for n do
sort -R "$n" | head >"random_samples/${n##*/}"
done
이 짧은 쉘 스크립트는 주어진 경로명( 에서 찾은 일반 파일 find
)을 반복하고 sort -R
각 경로명에서 실행됩니다. 이렇게 하면 행이 섞이고 head
매번 섞인 처음 10개의 행이 생성됩니다. 출력은 random_samples
원본 파일과 동일한 파일 이름을 가진 디렉터리로 이동됩니다. 파일 이름 충돌은 확인되지 않습니다 random_samples
.
sort -R
대신 GNU coreutils를 사용할 수도 있습니다 shuf
.
유일한 단점은 무작위 샘플의 라인 순서가 무작위라는 점입니다. 즉, 무작위 샘플의 라인은 파일의 원래 순서에 따라 정렬되지 않습니다.
원본 파일에서와 같이 무작위 샘플에 대해 동일한 정렬을 수행하기 위해 짧은 쉘 스크립트를 다음으로 바꿀 수 있습니다.
for n do
awk -v OFS="\t" "{ print NR, \$0 }" "$n" | sort -R | head | sort -n |
cut -f 2 >"random_samples/${n##*/}"
done
먼저 파일의 각 줄에 줄 번호(및 탭)를 추가한 다음 줄을 섞고 이전과 같이 처음 10줄을 선택합니다. 그런 다음 선택한 행을 숫자로 정렬하고 샘플을 저장하기 전에 행 번호를 제거합니다.
다음 실행을 허용합니다 find
.
find dir -type f -exec sh -c '
for n do
awk -v OFS="\t" "{ print NR, \$0 }" "$n" | sort -R | head | sort -n |
cut -f 2 >"random_samples/${n##*/}"
done' sh {} +
10개보다 많거나 적은 행을 선택하려면 선택하려는 행 수의 head
위치 head -n NUM
를 변경하세요.NUM