J'ai un très gros fichier (~ 400 Go), et je dois en supprimer les 2 dernières lignes. J'ai essayé d'utiliser sed
, mais il a fonctionné pendant des heures avant d'abandonner. Y a-t-il un moyen rapide de le faire, ou suis-je coincé avec sed
?
linux
sed
text-manipulation
Russ Bradberry
la source
la source
head -n -2 file
Réponses:
Je n'ai pas essayé cela sur un gros fichier pour voir à quelle vitesse il est, mais cela devrait être assez rapide.
Pour utiliser le script pour supprimer des lignes à la fin d'un fichier:
Il cherche à la fin du fichier, vérifie que le dernier caractère est une nouvelle ligne, puis lit chaque caractère un par un en remontant jusqu'à ce qu'il trouve trois nouvelles lignes et tronque le fichier juste après ce point. Le changement est effectué sur place.
Edit: j'ai ajouté une version Python 2.4 en bas.
Voici une version pour Python 2.5 / 2.6:
Voici une version Python 3:
Voici une version Python 2.4:
la source
vous pouvez essayer la tête GNU
la source
head: illegal line count -- -2
Je vois que mes systèmes Debian Squeeze / testing (mais pas Lenny / stable) incluent une commande "tronquer" dans le cadre du paquet "coreutils".
Avec cela, vous pouvez simplement faire quelque chose comme
pour supprimer 160 octets à la fin du fichier (vous devez évidemment déterminer exactement combien de caractères vous devez supprimer).
la source
dd
script fera cela (vous devez spécifier le décalage d'entrée pour obtenir le dernier kilo-octet, puis utilisertail -2 | LANG= wc -c
, ou quelque chose comme ça).tail
est également efficace pour les fichiers volumineux - peut être utilisétail | wc -c
pour calculer le nombre d'octets à supprimer.Le problème avec sed est qu'il s'agit d'un éditeur de flux - il traitera l'intégralité du fichier même si vous ne souhaitez apporter des modifications qu'à la fin. Quoi qu'il en soit, vous créez un nouveau fichier de 400 Go, ligne par ligne. Tout éditeur qui opère sur l'ensemble du fichier aura probablement ce problème.
Si vous connaissez le nombre de lignes, vous pouvez utiliser
head
, mais encore une fois, cela crée un nouveau fichier au lieu de modifier celui existant en place. Vous pourriez obtenir des gains de vitesse grâce à la simplicité de l'action, je suppose.Vous pourriez avoir plus de chance en utilisant
split
pour diviser le fichier en petits morceaux, en éditant le dernier, puis en utilisantcat
pour les combiner à nouveau, mais je ne suis pas sûr que ce sera mieux. J'utiliserais le nombre d'octets plutôt que les lignes, sinon ce ne sera probablement pas plus rapide du tout - vous allez toujours créer un nouveau fichier de 400 Go.la source
Essayez VIM ... Je ne sais pas s'il fera l'affaire ou non, car je ne l'ai jamais utilisé sur un si gros fichier, mais je l'ai utilisé sur des fichiers plus petits et plus grands dans le passé, essayez-le.
la source
Quel type de fichier et dans quel format? Peut être plus facile à utiliser quelque chose comme Perl selon le type de fichier - texte, graphiques, binaire? Comment est-il formaté - CSV, TSV ...
la source
Si vous connaissez la taille du fichier en octets (400000000160 disons) et que vous savez que vous devez supprimer exactement 160 caractères pour supprimer les deux dernières lignes, alors quelque chose comme
devrait faire l'affaire. Cela fait longtemps que je n'ai pas utilisé dd dans la colère; Je semble me souvenir que les choses vont plus vite si vous utilisez une taille de bloc plus grande, mais si vous pouvez le faire, cela dépend si les lignes que vous souhaitez supprimer sont à un bon multiple.
dd a quelques autres options pour compléter les enregistrements de texte à une taille fixe qui pourrait être utile comme passage préliminaire.
la source
Si la commande "tronquer" n'est pas disponible sur votre système (voir mon autre réponse), regardez la "man 2 tronquer" pour l'appel système pour tronquer un fichier à une longueur spécifiée.
Évidemment, vous devez savoir combien de caractères vous devez tronquer le fichier (taille moins la longueur du problème deux lignes; n'oubliez pas de compter les caractères cr / lf).
Et faites une sauvegarde du fichier avant d'essayer!
la source
Si vous préférez les solutions de style Unix, vous pouvez avoir une troncature de ligne d'enregistrement et interactive en utilisant trois lignes de code (testé sur Mac et Linux).
petite + troncature de ligne de style Unix sûre (demande de confirmation):
Cette solution repose sur quelques outils Unix courants, mais utilise toujours
perl -e "truncate(file,length)"
le remplacement le plus prochetruncate(1)
, qui n'est pas disponible sur tous les systèmes.Vous pouvez également utiliser le programme shell réutilisable complet suivant, qui fournit des informations d'utilisation et propose une confirmation de troncature, une analyse des options et une gestion des erreurs.
script de troncature de ligne complet :
Voici un exemple d'utilisation:
la source
des modifications sont apportées sur place. C'est plus simple et plus efficace que le script python.
la source
ed
pris 100 fois plus de temps à exécuter que mon script Python. Je ne peux qu'imaginer à quel point la différence serait encore plus grande pour le fichier OP qui est 7000 fois plus grand.Modification de la réponse acceptée pour résoudre un problème similaire. Pourrait être modifié un peu pour supprimer n lignes.
Et le test correspondant:
la source
Vous pouvez utiliser Vim en mode Ex:
-,
sélectionner les 2 dernières lignesd
supprimerx
sauver et fermerla source