Como dividir arquivos com base no número variável de linhas no Linux

2

Eu quero dividir um arquivo em partes iguais com o último arquivo recebendo os registros que sobraram no Unix. Por exemplo: O arquivo tem 4 linhas, eu quero dividir em 4 arquivos = incrível. 1 linha por arquivo.

Eu tenho 5 linhas, quero dividir em 4 arquivos. O que eu realmente quero aqui é isso:

File - number of lines;
f1 - 1;
f2 - 1;
f3 - 1;
f4 - 2;

Isso é possível através de um comando de divisão direta no Unix? Eu não estou pensando sem uma codificação extra iterativa em torno da divisão?

Veja o que eu tentei:

numsplitfile=$parm (lets say 4)
total_lines=$(wc -l < $inputfile) (lets say the file has 5 lines)
lines_per_file = (total_lines + numsplitfile - 1) / numsplitfile)
split -l $lines_per_file $inputfile splitfilename

O que isso está fazendo é que ele será convertido em:

split -l 2 $inputfile splitfilename

daí me dando 3 arquivos com 2, 2, 1 linhas cada. Mas o que eu quero é de 1, 1, 1, 2 linhas em 4 arquivos.

    
por sreeni 29.11.2014 / 07:31

1 resposta

0

Parece que você não conseguirá fazer isso apenas com um comando dividido, mas poderá contorná-lo.
Tente algo assim:

#!/bin/bash
inputfile=$1
parts=$2
total_lines=$(wc -l < "$inputfile")
lines_per_file=$[$total_lines / $parts]

rm out*  2>/dev/null
split -d -l $lines_per_file "$inputfile" out

extra_files=$(printf "out%02i\n" 'seq $parts $[$parts * 2 - 1]')
last_file=$(printf "out%02i\n" $[$parts - 1])
cat $extra_files >> $last_file   2>/dev/null  # ignore errors
rm  $extra_files                 2>/dev/null  # ignore errors

Nomeie split_file , então você pode chamar assim:

$ ./split_file input_file 4

Os arquivos divididos serão chamados out00 out01 out02 etc ...

    
por 29.11.2014 / 18:26

Tags