目前,我的 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))
) 进行模数不为零,则必须将备用模数分配给部件。一种解决方案是为零件的模数值添加一行。
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