디렉토리의 각 파일에서 n줄의 무작위 샘플을 선택하는 방법

디렉토리의 각 파일에서 n줄의 무작위 샘플을 선택하는 방법

많은 파일이 포함된 디렉토리가 있습니다. 각 파일에서 무작위 샘플을 가져와서 무작위 샘플을 가져온 파일과 동일한 파일 이름을 가진 새 디렉터리에 복사하고 싶습니다.

답변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

관련 정보