入力ファイルを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))部品数()がゼロでない場合は、代替モジュロを部品に割り当てる必要があります。 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

おすすめ記事