주어진 숫자의 "보통 큰" 제수를 찾으십니까?

주어진 숫자의 "보통 큰" 제수를 찾으십니까?

일부 데이터를 처리한 후 특정 수의 데이터 포인트(한 줄에 하나씩)가 포함된 파일을 얻습니다. 이러한 데이터 포인트를 더 많은 숫자 처리를 수행하는 다른 도구에 전달해야 합니다. 해당 도구에서 특정 실행에 대한 "배치 크기"를 설정해야 합니다.

./gen_data.sh > data.txt
./process_data.sh < data.txt > parsed.bin
./crunch_data.sh --total=$(wc -l < data.txt) --batch_size=N --infile=parsed.bin

배치 크기가 N너무 작으면 처리하는 데 시간이 오래 걸리고, 배치 크기가 너무 크면 출력 품질이 낮아집니다. 배치 크기는 로 주어진 데이터 포인트 수로 나누어야 합니다 M=$(wc -l < data.txt). N주변 가치는 M/10꽤 좋은 것 같습니다. 배치 크기가 이상한 상황에서 이상한 일을 하는 경우(예: N=M소수의 경우 M거의 확실하게 발생하지 않으므로 걱정하지 않음) 별 문제가 되지 않습니다.

쉘 도구를 사용하여 이를 수행하는 깔끔한 방법이 있습니까? 나는 M의 인수를 얻을 수 있다는 것을 알고 있습니다 factor. Python에서는 다음과 같이 작성할 수 있습니다.

total_portion = 1
for factor in factors(M):
    total_portion *= factor
    if total_portion > 10:
        return M/total_portion

이제 내가 얻는 점수는 요소 수에 M따라 1/10보다 약간 작습니다 .M

쉘 스크립트로 이 작업을 수행하는 방법이나 이를 더 쉽게 만들기 위해 어떤 도구를 사용할 수 있는지 잘 모르겠습니다. 이 일을 잘 할 수 있을까? 요소 목록을 작은 Python 스크립트에 전달하고 거기에서 논리를 수행하는 것이 더 낫습니까?

답변1

다음은 GNU를 사용하는 Python 알고리즘의 셸 버전입니다 factor.

#! /bin/bash

function total_portion() {
    local M="$1"
    local total_portion=1

    for factor in $(factor "$M" | sed -e 's/^[0-9]\+: //'); do
        ((total_portion *= factor))
        if [ "$total_portion" -gt 10 ] ; then
            echo $((M / total_portion))
            return 
        fi
    done
}

M=$(wc -l < data.txt)

tp=$(total_portion "$M")

관련 정보