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