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?

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

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


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


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


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.


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

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

0

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.