現在私の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))
部品数()がゼロでない場合は、代替モジュロを部品に割り当てる必要があります。 1つの回避策は、部品のモジュラス値に行を追加することです。
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