将输入文件拆分为 X 个部分,大小为总行数 / X

将输入文件拆分为 X 个部分,大小为总行数 / X

目前,我的 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

相关内容