Dividir o arquivo de entrada em X partes do tamanho total de linhas / X

3

Atualmente, meu script básico é dividido por várias linhas. No entanto, gostaria de dividir um arquivo em X partes, cada uma com o total de linhas igual ao tamanho do arquivo dividido por X. O script é executado da seguinte maneira:

./script.sh input_file.tsv

Até agora, no script, tenho isto:

INPUT_FILE=$1
SPLIT_NUM_THREADS=15
TOTAL_LINES=$(wc -l < $INPUT_FILE)
SPLIT_NUM=$( echo "scale=6; $TOTAL_LINES / $SPLIT_NUM_THREADS" | bc)

Os seguintes problemas existem:

  • Usar $ INPUT_FILE para obter TOTAL_LINES me causa o erro "redirecionamento ambíguo", mas usar simplesmente "input.tsv" não. O que há de errado aí?
  • SPLIT_NUM é um float, como posso convertê-lo em um int para que ele possa ser dividido por linhas?

Como posso resolver esses problemas e dividir um arquivo por número de partes?

    
por Befall 19.11.2014 / 23:39

1 resposta

2

Cada parte obtém a divisão inteira ( $((a/b)) ). Se o número da linha modulo o número de peças ( $((a%b)) ) não for zero, então você tem que distribuir o número do módulo de reposição sobre as partes. Uma solução é dar ao módulo valor number de partes uma linha adicional.

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
    
por 20.11.2014 / 00:24