Aqui está um script bash
supondo que seu arquivo de entrada é chamado de infile e os intervalos são armazenados 1 por linha em um arquivo denominado splits:
i=1
for range in $(< splits); do
sed -n "$(echo "$range" | cut -f1 -d, )p" infile > "file$i"
sed -n "$(echo "$range" | cut -f2 -d, )p" infile >> "file$i"
((i++))
done
Isso simplesmente usa sed
para imprimir as linhas especificadas pelos intervalos e salva cada resultado como um novo arquivo (os arquivos criados são denominados arquivo1 arquivo2 arquivo3 etc). Duas invocações de sed
são usadas para preservar a ordem especificada das linhas.
Observe que não há verificação de formato ou erro feita por este script simples e arquivos existentes chamados, por exemplo, file1 será sobrescrito.
Uma alternativa simplificada (cortesia de @muru ) usando while read
e permitindo que o bash divida os intervalos em vez de cortar:
i=1
while IFS=',' read n1 n2
do
sed -n "$n1 p; $n2 p" infile > "file$i"
((i++))
done < splits
Se a ordem das linhas nos arquivos de saída for importante (por exemplo, linhas 5,4! = 4,5), o bit sed
precisará ser dividido em duas invocações separadas, semelhantes ao primeiro script.