Divide um arquivo em dois

13

Eu tenho um arquivo grande e preciso dividir em dois arquivos. Suponha que no primeiro arquivo as 1000 linhas devam ser selecionadas e colocadas em outro arquivo e deletadas aquelas linhas no primeiro arquivo.

Eu tentei usar split , mas está criando vários fragmentos.

    
por Aravind 21.10.2014 / 17:50

4 respostas

22

A maneira mais fácil é provavelmente usar head e tail :

$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2

Isso colocará as primeiras 1000 linhas de input-file em output1 e todas as linhas de 1001 até o final em output2

    
por 21.10.2014 / 18:11
8

Acho que split é a melhor abordagem.

Tente usar a opção -l xxxx , em que xxxx é o número de linhas que você deseja em cada arquivo (o padrão é 1000).

Você pode usar a opção -n yy se estiver mais preocupado com a quantidade de arquivos criados. Use -n 2 para dividir seu arquivo em apenas 2 partes, não importando a quantidade de linhas em cada arquivo.

Você pode contar a quantidade de linhas no seu arquivo com wc -l filename . Este é o comando 'wordcount' com a opção de linhas.

Referências

  • man split
  • man wc
por 21.10.2014 / 18:44
7

Este é um trabalho para csplit :

csplit -s infile 1001 

dividirá s de maneira aleatória infile , a primeira peça xx00 - até, mas não incluindo a linha 1001 e a segunda peça xx01 - as linhas restantes.
Você pode jogar com as opções se precisar de diferentes nomes de arquivos de saída, por exemplo, usando -f e especificando um prefixo :

csplit -sf piece. infile 1001 

produz dois arquivos chamados piece.00 e piece.01

Com um head inteligente, você também pode fazer algo como:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
    
por 11.05.2015 / 00:54
4

Uma maneira simples de fazer o que a pergunta pede, em um comando:

awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile

ou, para aqueles que realmente odeiam digitar comandos longos e intuitivamente compreensíveis,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
    
por 21.10.2014 / 23:11