J'ai un fichier texte de 250 Mo, le tout sur une seule ligne.
Dans ce fichier, je veux remplacer les a
caractères par des b
caractères:
sed -e "s/a/b/g" < one-line-250-mb.txt
Il échoue avec:
sed: couldn't re-allocate memory
Il me semble que ce type de tâche pourrait être effectué en ligne sans allouer beaucoup de mémoire.
Existe-t-il un meilleur outil pour le travail ou une meilleure façon de l'utiliser sed
?
GNU sed version 4.2.1
Ubuntu 12.04.2 LTS
1 Go de RAM
text-processing
sed
performance
large-files
out-of-memory
Nicolas Raoul
la source
la source
Réponses:
Oui, utilisez
tr
plutôt:sed
traite en lignes de sorte qu'une énorme ligne lui causera des problèmes. Je m'attends à ce qu'il déclare une variable en interne pour contenir la ligne et votre entrée dépasse la taille maximale allouée à cette variable.tr
d'autre part traite des caractères et devrait être capable de gérer correctement les lignes arbitrairement longues.la source
sed -e "s/a/z/g" b.txt > c.txt
sans aucun problème. Utilisation de sed (GNU sed) 4.2.2.sed
version, je suppose que cela dépend de l'implémentation ou du matériel.sed
.Les versions historiques de sed et awk avaient des problèmes de mémoire, ceux-ci ont principalement été corrigés dans des versions plus récentes, mais l'une des occurrences classiques de ce problème a frappé Larry Wall assez durement. sa réponse a été d'écrire un nouveau langage de programmation - sans limites de mémoire autres que le matériel. Il l'a appelé perl. votre problème spécifique peut être résolu plus simplement, mais la règle générale que j'utilise est lorsque sed n'utilisera pas perl.
Modifier: sur demande un exemple:
ou pour une utilisation moindre de la mémoire:
la source
sed
, cependant. : \