현재 내 bash 스크립트는 줄 번호로 분할되어 있습니다. 그러나 파일을 X 부분으로 분할하고 각 부분의 총 줄 수는 파일 길이를 X로 나눈 값과 같습니다. 스크립트는 다음과 같이 실행됩니다.
./script.sh input_file.tsv
지금까지 스크립트에는 다음과 같은 내용이 있습니다.
INPUT_FILE=$1
SPLIT_NUM_THREADS=15
TOTAL_LINES=$(wc -l < $INPUT_FILE)
SPLIT_NUM=$( echo "scale=6; $TOTAL_LINES / $SPLIT_NUM_THREADS" | bc)
다음과 같은 문제가 있습니다.
- $INPUT_FILE을 사용하여 TOTAL_LINES를 가져오면 "모호한 리디렉션" 오류가 발생하지만 "input.tsv"만 사용하면 그렇지 않습니다. 무슨 문제가 있었나요?
- SPLIT_NUM은 부동 소수점입니다. 행별로 분할할 수 있도록 어떻게 int로 변환할 수 있나요?
이러한 문제를 해결하고 파일을 블록 수별로 분할하려면 어떻게 해야 합니까?
답변1
각 부분은 정수 나누기( $((a/b))
)를 받습니다. 라인 번호 $((a%b))
모듈로 부품 수( )가 0이 아닌 경우 대체 모듈로를 부품에 할당해야 합니다. 한 가지 해결 방법은 부품의 모듈러스 값에 대한 행을 추가하는 것입니다.
SPLIT_NUM_THREADS=15
TOTAL_LINES=52
for((i=0;i<$((TOTAL_LINES%SPLIT_NUM_THREADS));i++)); do
echo $((TOTAL_LINES/SPLIT_NUM_THREADS+1))
done
4
4
4
4
4
4
4
for((i=$((TOTAL_LINES%SPLIT_NUM_THREADS));i<SPLIT_NUM_THREADS;i++)); do
echo $((TOTAL_LINES/SPLIT_NUM_THREADS))
done
3
3
3
3
3
3
3
3