Como dividir um arquivo grande?

5

Como posso passar todos os arquivos em um list.txt que se parece com

file1_1.txt
file1_2.txt
file1_3.txt
file1_4.txt

para o comando split (existem outros arquivos txt no diretório) e faça com que ele retorne as partes numeradas como em (suponha que o arquivo1_1.txt seja fragmentado em 4 partes)

file1_1_1.txt;
file1_1_2.txt;
file1_1_3.txt;
file1_1_4.txt 

e assim por diante ....

    
por user3069326 05.05.2015 / 07:20

3 respostas

6

Para garantir que não haja quebra de linha, você pode usar outra opção além de c .

split -n #number

divida um arquivo por #number pedaços para que você possa ter certeza de que eles são iguais e mais nenhuma quebra de linha.Exemplo

split -n 4 file.txt

Isso dividirá o arquivo.txt em 4 partes.

OU você pode dividir pelo número de linhas

split -l #number-of-lines

exemplo

split -l 200 file.txt

Isso dividirá o arquivo.txt em arquivos, cada um com 200 linhas. Mas isso não é exato, pois todos são do mesmo tamanho, já que o último arquivo pode ser menor que o número escolhido.

Agora, no que diz respeito à nomenclatura. O padrão da divisão de comandos é usar um sufixo padrão "x" e os prefixos padrão "aa" "ab" "ac" ...

Portanto, para alterar esses padrões, você precisa declarar um sufixo a ser usado.

no seu caso, você pode usar

split -n #number file1_1.txt file1_1.

A saída seria como file1_1.aa file1_1.ab file1_1.ac

Senão você pode alterar o prefixo padrão para ser numérico usando -d

  split -n #number -d file1_1.txt file1_1.

A saída seria como file1_1.00 file1_1.01 file1_1.02

Assim, você não pode obter o nome desejado com a divisão padrão, a menos que use awk ou sed com REGEX.

Agora, para ler o conjunto de arquivos de um arquivo, vamos chamar files.list

while IFS= read -r file

do split -n #number -d "$file" "$file"

done < files.list

ATUALIZAÇÃO: cheguei a esta link

De acordo com a segunda resposta

% bl0ck_qu0te%

Portanto, no seu caso, se a sua versão dividida for > 8,16, então você poderá fazer a sua necessidade assim

split -n #number -d --additional-suffix=.txt file1_1.txt file1_1-

Assim, a saída seria como

file1_1-00.txt file1_1-01.txt file1_1-02.txt .....
    
por Maythux 05.05.2015 / 07:35
2
while read file; do split <some options> "$file"; done < list.txt

Se os nomes dos seus arquivos puderem conter espaço em branco ou barras invertidas, use isso:

while IFS= read -r file; do split <some options> "$file"; done < list.txt
    
por Cyrus 05.05.2015 / 07:37
1

Aqui está o meu oneliner bruto:

% bl0ck_qu0te%

Explicação :

O arquivo contém entradas:

file1_1.txt
file1_2.txt
file1_3.txt
file1_4.txt

Nós pegamos aqueles com awk, e usando ponto como delimitador, criamos uma lista de duas colunas

file1_1.txt file1_1_
file1_2.txt file1_2_
file1_3.txt file1_3_
file1_4.txt file1_4_

Em seguida, o xargs usa essa saída, duas entradas por execução (-n2), e é executado com sufixos numéricos que começam em 1, são divididos em 4 arquivos e adicionam ".txt" no final. E aqui está a demonstração desse oneliner:

    
por Sergiy Kolodyazhnyy 09.05.2015 / 04:15