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?
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
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à.>>
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.
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)
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".