web-dev-qa-db-fra.com

Comment limiter (ou tronquer) un fichier texte en nombre de lignes?

Je voudrais utiliser un terminal/Shell pour tronquer ou autrement limiter un fichier texte à un certain nombre de lignes.

J'ai tout un répertoire de fichiers texte, pour chacun desquels seules les premières 50k lignes sont utiles.

Comment supprimer toutes les lignes de plus de 50000?

30
sjmurphy

Troncature sur place

Pour tronquer le fichier en place avec sed, vous pouvez procéder comme suit:

sed -i '50001,$ d' filename
  • -i Signifie en place.
  • d signifie supprimer.
  • 50001,$ Signifie les lignes de 50001 à la fin.

Vous pouvez effectuer une sauvegarde du fichier en ajoutant un argument d'extension à -i, Par exemple, .backup Ou .bak:

sed -i.backup '50001,$ d' filename

Dans OS-X ou FreeBSD vous devez fournir un argument à -i - donc faites ceci en évitant de faire une sauvegarde:

sed -i '' '50001,$ d' filename

La version du nom d'argument long est la suivante, avec et sans l'argument de sauvegarde:

sed --in-place '50001,$ d' filename
sed --in-place=.backup '50001,$ d' filename

Nouveau fichier

Pour créer un nouveau fichier tronqué, il suffit de rediriger de head vers le nouveau fichier:

head -n50000 oldfilename > newfilename
  • -n50000 Signifie le nombre de lignes, sinon head par défaut à 10.
  • > Signifie rediriger vers, en écrasant tout ce qui pourrait être là.
  • Remplacez >> Par > Si vous souhaitez l'ajouter au nouveau fichier.

Il est regrettable que vous ne puissiez pas rediriger vers le même fichier, c'est pourquoi sed est recommandé pour la troncature sur place.

Pas de sed? Essayez Python!

C'est un peu plus typant que sed. Sed est l'abréviation de "Stream Editor" après tout, et c'est une autre raison de l'utiliser, c'est pour cela que l'outil est adapté.

Cela a été testé sur Linux et Windows avec Python 3:

from collections import deque
from itertools import islice

def truncate(filename, lines):
    with open(filename, 'r+') as f:
        blackhole = deque((),0).extend
        file_iterator = iter(f.readline, '')
        blackhole(islice(file_iterator, lines))
        f.truncate(f.tell())

Pour expliquer le Python:

Le trou noir fonctionne comme /dev/null. C'est une méthode extend liée sur un deque avec maxlen=0, Qui est le moyen le plus rapide d'épuiser un itérateur dans Python (que je ' m au courant).

Nous ne pouvons pas simplement boucler sur l'objet fichier car la méthode tell serait bloquée, nous avons donc besoin de l'astuce iter(f.readline, '').

Cette fonction montre le gestionnaire de contexte, mais c'est un peu superflu puisque Python fermerait le fichier en quittant la fonction. L'utilisation est simplement:

>>> truncate('filename', 50000)
60
Aaron Hall

Très facile en effet avec sed:

sed -n '1,50000 p' filename

Cela n'imprimera que les lignes 1 à 50000 dans le fichier "nom de fichier".

3
tdk2fe