Como arquivar a divisão em um número de linha [fechada]

94

Quero dividir um arquivo de log de 400 mil linhas de um número de linha específico.

Para esta pergunta, vamos definir um número arbitrário de 300k.

Existe um comando linux que me permite fazer isso ( dentro do script )?

Eu sei que splitme permite dividir o arquivo em partes iguais por tamanho ou números de linha, mas não é isso que eu quero. Quero os primeiros 300k em um arquivo e os últimos 100k no segundo arquivo.

Qualquer ajuda seria apreciada. Obrigado!

Pensando bem, isso seria mais adequado para o site de superusuário ou serverfault.

desnormalizador
fonte
16
Eu acho que esta questão está bem aqui. Você tem uma tarefa de programação que está tentando resolver com um script de shell; se for uma linha usando ferramentas Unix amplamente disponíveis, tanto melhor!
Jim Lewis
Eu pensei o mesmo. Mas, novamente, eu não estava escrevendo um script de shell :) bem, encontrei minha resposta de qualquer maneira. Obrigado
denormalizer de
5
Esta questão está bem, sem dúvida, é uma questão de programação e também não é muito localizada
Peter
9
por que esta é uma questão fora do tópico? a polícia do pensamento está mais louca do que nunca.
Karel Bílek de
6
Embora esta questão possa ser um pouco fora do tópico, é altamente votada e é o primeiro resultado nos motores de busca com tais consultas "arquivo dividido linux na linha". Assim, sugiro reabrir esta questão, para que outras respostas valiosas possam ser adicionadas. Ou pelo menos faça um link para a pergunta mais relevante no SU.
Antoine Pinsard

Respostas:

178
file_name=test.log

# set first K lines:
K=1000

# line count (N): 
N=$(wc -l < $file_name)

# length of the bottom file:
L=$(( $N - $K ))

# create the top of file: 
head -n $K $file_name > top_$file_name

# create bottom of file: 
tail -n $L $file_name > bottom_$file_name

Além disso, pensando bem, a divisão funcionará no seu caso, uma vez que a primeira divisão é maior do que a segunda. A divisão coloca o saldo da entrada na última divisão, então

split -l 300000 file_name

produzirá xaacom 300k linhas e xabcom 100k linhas, para uma entrada com 400k linhas.

Acadêmico Robô
fonte
Obrigado. encontrou uma pergunta respondida de forma semelhante no superusuário ie. use tail etc E, sim, dividir funcionará com meu exemplo, mas nem sempre meu exemplo foi 100K.
denormalizer de
2
Se você está tentando fazer isso no Windows e não quer usar o Cygwin, este projeto fornece todos os utilitários
Jonathon Hill
15
Eu usaria tail -n +L file_name > bottom_fileonde simplesmente L=K+1sem necessidade de executar wcprimeiro
Hashbrown de
2
Eu prefiro usar sed -n '1,1000p' test.log > top_test.log ; sed '1,1000d' test.log > bottom_test.log. IHMO, isso é mais simples e não exige o cálculo do número total de linhas. Além disso, ainda funciona se linhas forem acrescentadas entre a execução de cada comando.
Antoine Pinsard
Para alguns arquivos, esta resposta deixa uma linha, mas a edição sugerida por Hashbrown corrige o problema.
scharette