Dividir um arquivo em dois

18

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 exclua essas linhas no primeiro arquivo.

Eu tentei usar, splitmas ele está criando vários pedaços.

Aravind
fonte
Você checou split --help?
Braiam 21/10
Sim, eu verifiquei, mas está criando vários arquivos que não precisam de mim.
Aravind

Respostas:

30

A maneira mais fácil é provavelmente usar heade tail:

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

Isso colocará as primeiras 1000 linhas de input-filedentro output1e todas as linhas de 1001 até o final deoutput2

Michael Mrozek
fonte
13

Eu acho que splité sua melhor abordagem.

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

Você pode usar a -n yyopção se estiver mais preocupado com a quantidade de arquivos criados. O uso -n 2dividirá seu arquivo em apenas 2 partes, independentemente da quantidade de linhas em cada arquivo.

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

Referências

  • man split
  • man wc
Lucien Raven
fonte
1
Isto é como dividir em um monte de arquivos com um número fixo de linhas ou como dividir igualmente em um número fixo de arquivos. Existe uma maneira de dividir em um arquivo de 1000 linhas e um arquivo com todo o resto? Era o que ele estava pedindo; Não consegui encontrá-lo na página de manual
Michael Mrozek
Você está correto, Michael. Eu acho que tive uma visão simplista sobre a questão. Sua solução é a melhor nesse caso. Outra maneira seria usar o comando 'sed': sed -n 1,1000 arquivo original> primeiro_1000_lines. sed '1,1000d' arquivo original> linhas_ restantes.
Lucien Raven #
Claro que você poderia fazer split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??.
G-Man diz 'Reinstate Monica'
8

Este é um trabalho para csplit:

csplit -s infile 1001 

irá sdividir-se intencionalmente 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 nomes de arquivos de saída diferentes, por exemplo, usando -fe especificando um prefixo :

csplit -sf piece. infile 1001 

produz dois arquivos nomeados piece.00epiece.01


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

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
don_crissti
fonte
1
Uau, ele realmente é um trabalho para csplit. Muito agradável. (Eu só estou lendo a lista de comandos POSIX e teve enorme dificuldade para finalizar a minha cabeça em torno do csplitpropósito de comando na primeira Acontece que ele é realmente muito simples..) :)
Wildcard
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
G-Man Diz 'Reinstate Monica'
fonte