Modifier la première ligne d'un fichier texte volumineux

16

J'ai un fichier texte énorme, beaucoup trop gros pour que tout soit mémorisé. Tout ce que je dois faire avec ce fichier texte est d’éditer la première ligne (c’est un fichier CSV et j’ai besoin de modifier les titres).

Y a-t-il un moyen simple de faire cela en bash?

lynks
la source
Y a-t-il une raison pour laquelle vous ne pouvez pas simplement utiliser un éditeur de texte?
dangph
Le fichier est trop volumineux, il est plus de 20 fois plus volumineux que ma mémoire virtuelle maximale sur cette machine.
lynks
1
C'est suffisant. J'avais l'impression que les bons éditeurs de texte pouvaient traiter des fichiers très volumineux car ils ne mémorisaient que ce dont ils avaient besoin, mais après avoir lu certaines des questions, il semble que la plupart d'entre eux ont des problèmes avec eux.
dangph
@ dangph True ... peut-être étrange, mais quelques "éditeurs de texte" anciens et obsolètes (du genre), comme edlin pour ms-dos ou ed car Unix ne semblait pas avoir ce problème, mais seulement des éditeurs de ligne ... La RAM était alors une chose rare et précieuse et une taille de fichier en gigaoctets était une chose impossible à croire! ;)
laurent
Pour laisser les choses claires;): je ne manque pas ed!!! mais ce serait un bon ajustement dans ce cas (je ne suis pas sûr qu'il puisse gérer un fichier de cette taille ...)
laurent

Réponses:

21

Vous pouvez utiliser less pour voir ce que vous voulez éditer et utiliser sed faire les changements. De cette façon, vous éditez sans charger le fichier entier.

Une autre méthode consiste à scinder le fichier, à le modifier et à le rejoindre:

split -b 10000k <file>

and to join:

cat xa* > <file>
laurent
la source
upvote pour sed.
atroon
Fantastique, diviser et rejoindre était exactement ce que je cherchais, merci.
lynks
Bien sûr, sed est préférable car il peut facilement rechercher / remplacer l’ensemble du fichier, mais s’il n’a besoin que de changer la première ligne, la division n’est pas mauvaise ni plus rapide.
laurent
4
sed aurait pris des heures à parcourir l’ensemble du fichier (ce qui représente un peu moins de la moitié d’une TB), les modifications n’apparaissant que sur la première ligne, le scinder semble judicieux.
lynks
3

Si votre modification modifie la longueur de la ligne, le fichier entier doit être réécrit, voir par exemple cette discussion sur SO. Vous devriez probablement envisager de sauvegarder les données dans une base de données.

En gardant cela à l'esprit, vous pouvez éditer le fichier en streaming avec sed. Pour remplacer la première ligne, faites quelque chose comme ceci (GNU sed):

< oldfile sed '1c\new_heading' > newfile
Thor
la source