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?

Kohjah Breese
fonte

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
chave de aço
fonte
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

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

tente isso,

tail -n +43 dump.sql > dump_new.sql

ptantiku
fonte
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

Steven Penny
fonte
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.

kb2bcg
fonte
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
souravc
fonte
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
Jerinaw
fonte
0

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

Akash Agarwal
fonte