Remover as primeiras n linhas de um arquivo de texto grande


63

Preciso remover as primeiras 42 linhas de um dump SQL de 2 GB.

Eu sei que posso ver as primeiras linhas usando:

head -n 44 dump.sql

Mas existe alguma maneira de editá-los ou removê-los?

Respostas:


91

Se você quiser apenas ver as linhas do 43º, você pode usar

tail -n +43 dump.sql

O +sinal é importante - sem ele, tailas últimas 43 linhas serão impressas . Alternativamente com 'sed'

sed 1,42d dump.sql

Se você realmente deseja excluir as primeiras 42 linhas do arquivo original, faça com que o sed faça a alteração no local com a -iopção

sed -i 1,42d dump.sql

Resposta incrível, uso fantástico de tail. Encontrei muitas vezes algo novo para aprender com suas respostas. obrigado.
souravc

11
Oh man tail -n +43 é um divisor de águas! Eu tenho usado uma invocação estranha de sed para o mesmo efeito.
pfctdayelise

4
E se você não tiver mais espaço no dispositivo? sed -i 1,50000000d 17GigFilecria um arquivo temporário sedXYZque consome muito mais gigabytes. Existe uma abordagem sem arquivos temporários?
juanmf

Qual é a diferença entre tail -n +43e head -n 44como mencionado na pergunta?
Hashim

@ juanmf Você pode tentar fazer isso com uma ferramenta de interface gráfica (eu fiz isso usando o Mousepad, mas o arquivo de interesse era "apenas" ~ 700 MB. Demora um pouco para o arquivo carregar, no entanto ...
Digger

18

Este parece ser o mais fácil:

sed '1,42d' test.sql > test2.sql

Remova as linhas 1-42 do test.sql e salve como test2.sql


9
um menor seria sed -i '1,42d' test.sql se você não precisar manter o arquivo original.
Sadi


3

Você pode usar o Vim no modo Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 mover para a primeira linha

  2. 42 selecione 42 linhas

  3. d excluir

  4. x salvar e fechar


11
Ele cria um arquivo temporário? É possível fazer isso quando o espaço restante no dispositivo é menor que o tamanho do arquivo?
juanmf

2
@juanmf Todas essas soluções requerem um arquivo temporário. Só é possível remover dados do final de um arquivo sem usar um arquivo temporário.
PerlDuck

0

Desculpe, não posso fornecer o código real no momento. No entanto, tente olhar algo ao longo das linhas de

tail -n arcv(`wc -l`) -44

O que isto deve fazer (uma vez formatado corretamente) é contar o número de linhas no arquivo (wc -l), subtrair 44 dele (-44) e imprimir tudo o que começa com a 45ª linha do arquivo.

Espero que isso ajude e boa sorte.


Isso não é muito melhor, chamando wc -lsobre o arquivo, você processá-lo duas vezes, enquanto sedou tailprocessá-lo apenas uma vez.
yo '

0

Tente isso,

head -n 42 dump.sql > tmp; cat dump.sql | grep -vxf tmp > dump.sql.new; rm tmp

ou,

a=$(cat dump.sql| wc -l); tail -n "$((a-42))" dump.sql > dump.sql.new

0

Apenas para adicionar isso. Se você estiver em um Mac, precisará adicionar a extensão de backup. Resposta desta postagem .

sed -i '.bak' 1,42d dump.sql

0

Por causa de seddiscrepâncias no Linux e Mac, resolvi usar o tail -n +43 dump.sql > dump.sqlformato.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.