Supprimer les n premières lignes d'un fichier texte volumineux

63

Je dois supprimer les 42 premières lignes d'un dump SQL de 2 Go.

Je sais que je peux voir les premières lignes en utilisant:

head -n 44 dump.sql

Mais est-il possible de les modifier ou de les supprimer?

Kohjah Breese
la source

Réponses:

91

Si vous voulez seulement voir les lignes à partir de la 43e, vous pouvez utiliser

tail -n +43 dump.sql

Le +signe est important - sans cela, tailles 43 dernières lignes seront imprimées . Alternativement avec 'sed'

sed 1,42d dump.sql

Si vous voulez vraiment supprimer les 42 premières lignes du fichier original, vous pouvez faire la modification en place avec l' -ioption

sed -i 1,42d dump.sql
Steeldriver
la source
Réponse géniale, utilisation fantastique de tail. J'ai souvent trouvé quelque chose de nouveau à apprendre de vos réponses. Merci.
Souravc
1
Oh man tail -n +43 change la donne! J'ai utilisé une invocation maladroite de sed dans le même sens.
pfctdayelise
4
Que se passe-t-il s'il ne reste plus d'espace sur votre appareil? sed -i 1,50000000d 17GigFilecrée un fichier temporaire sedXYZqui consomme beaucoup plus de giga-octets. Existe-t-il une approche sans fichiers temporaires?
juanmf
Quelle est la différence entre tail -n +43et head -n 44comme mentionné dans la question?
Hashim
@juanmf Vous pouvez essayer de faire cela avec un outil graphique (je l'ai fait avec Mousepad, mais le fichier qui nous intéressait était "seulement" ~ 700 Mo. Il faut un certain temps pour que le fichier se charge, bien que ...
Digger
18

Cela semble être le plus facile:

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

Supprimez les lignes 1 à 42 de test.sql et enregistrez sous test2.sql

Kohjah Breese
la source
9
un plus court serait sed -i '1,42d' test.sql si vous n'avez pas besoin de conserver le fichier d'origine.
Sadi
10

essaye ça,

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

ptantiku
la source
3

Vous pouvez utiliser Vim en mode Ex:

ex -s -c '1d42|x' dump.sql
  1. 1 passer à la première ligne

  2. 42 sélectionnez 42 lignes

  3. d effacer

  4. x sauver et fermer

Steven Penny
la source
1
Crée-t-il un fichier temporaire? Est-il possible de le faire lorsque l'espace disponible sur le périphérique est inférieur à la taille du fichier?
juanmf
2
@juanmf Toutes ces solutions nécessitent un fichier temporaire. Il est uniquement possible de supprimer des données à la fin d'un fichier sans utiliser de fichier temporaire.
PerlDuck
0

Désolé, je ne peux pas vous donner le code actuel pour le moment. Cependant, essayez de regarder quelque chose du genre

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

Ce que cela devrait faire (une fois correctement formaté) est de compter le nombre de lignes dans le fichier (wc -l), d’en retirer 44 (-44), puis d’imprimer le tout à partir de la 45e ligne du fichier.

J'espère que ça t'aide et bonne chance.

kb2bcg
la source
C'est pas tout à fait optimale, en appelant wc -lle fichier, vous traitez deux fois, alors sedou le tailtraiter qu'une seule fois.
Yo '24
0

Essaye ça,

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
la source
0

Juste pour ajouter ceci. Si vous êtes sur un Mac, vous devez ajouter l'extension de sauvegarde. Réponse de ce post .

sed -i '.bak' 1,42d dump.sql
Jerinaw
la source
0

En raison des seddivergences entre Linux et Mac, j'ai résolu d'utiliser le tail -n +43 dump.sql > dump.sqlformat.

Akash Agarwal
la source