![입력 파일을 X 부분으로 분할합니다. 크기는 총 라인 수 / X입니다.](https://linux55.com/image/59862/%EC%9E%85%EB%A0%A5%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20X%20%EB%B6%80%EB%B6%84%EC%9C%BC%EB%A1%9C%20%EB%B6%84%ED%95%A0%ED%95%A9%EB%8B%88%EB%8B%A4.%20%ED%81%AC%EA%B8%B0%EB%8A%94%20%EC%B4%9D%20%EB%9D%BC%EC%9D%B8%20%EC%88%98%20%2F%20X%EC%9E%85%EB%8B%88%EB%8B%A4..png)
현재 내 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