J'ai un problème avec l'affichage de morceaux d'un très gros fichier texte. Ce fichier, d'environ 19 Go, est évidemment trop volumineux pour être visualisé par tout moyen traditionnel.
J'ai essayé head 1
et tail 1
( head -n 1
et tail -n 1
) avec les deux commandes assemblées de différentes manières (pour arriver à un morceau au milieu) sans succès. Ma machine Linux exécutant Ubuntu 9.10 ne peut pas traiter ce fichier.
Comment gérer ce fichier? Mon objectif ultime est d'affiner les lignes 45000000 et 45000100.
split
de faciliter l'utilisation du gros fichier.dd
pour obtenir le morceau que vous recherchez. Par exempledd if=bigfile of=extractfile bs=1M skip=10240 count=5
, extraira 5 Mo du fichier à partir du point 10 Go.Réponses:
Vous devez utiliser
sed
.Cela indique
sed
d'imprimer les lignes 45000000-45000100 inclus et de quitter la ligne 45000101.la source
tail+|head
est plus rapide de 10 à 15%.Créez une base de données MySQL avec une seule table qui a un seul champ. Importez ensuite votre fichier dans la base de données. Cela rendra très facile la recherche d'une certaine ligne.
Je ne pense pas que quoi que ce soit d'autre pourrait être plus rapide (si
head
ettail
déjà échoué). En fin de compte, l'application qui souhaite trouver une lignen
doit parcourir l'intégralité du fichier jusqu'à ce qu'elle ait trouvé desn
sauts de ligne. Sans une sorte de recherche (index de ligne à décalage d'octets dans le fichier), aucune meilleure performance ne peut être obtenue.Étant donné la facilité avec laquelle il est possible de créer une base de données MySQL et d'y importer des données, je pense que c'est une approche viable.
Voici comment faire:
/tmp/my_large_file
serait le fichier que vous souhaitez lire.La syntaxe correcte pour importer un fichier avec des valeurs délimitées par des tabulations sur chaque ligne est:
Un autre avantage majeur de ceci est que si vous décidez ultérieurement d'extraire un autre ensemble de lignes, vous n'avez pas à attendre à nouveau des heures pour le traitement (sauf si vous supprimez la base de données bien sûr).
la source
sed
commande ci-dessous et j'ai identifié mes lignes. Mais maintenant, j'ai une question complémentaire à laquelle la méthode de base de données peut être mieux adaptée. Je dois maintenant supprimer quelques centaines de lignes du fichier.sed
pourrais le faire aussi. Bien sûr, si vous aviez les données dans la base de données, il serait futile d'exporter un nouveau fichier avec juste les lignes que vous voulez.sed
réponse (parce que cela m'a fait plaisir plus immédiatement; -) mais je vous ai donné un vote positif car j'utiliserai votre méthode à l'avenir. Je vous en suis reconnaissant.FIELDS TERMINATED BY '\n'
à laLOAD DATA
ligne.Deux bons vieux outils pour les gros fichiers sont
join
etsplit
. Vous pouvez utiliser l'--lines=<number>
option Split with qui coupe le fichier en plusieurs fichiers d'une certaine taille.Par exemple
split --lines=45000000 huge_file.txt
. Les parties résultantes seraient en xa, xb, etc. Ensuite, vous pouvezhead
la partie xb qui inclurait les lignes que vous vouliez. Vous pouvez également «joindre» des fichiers à un seul gros fichier.la source
Vous disposez des bons outils, mais vous les utilisez incorrectement. Comme précédemment répondu à U&L,
tail -n +X file | head -n Y
(notez le+
) est 10-15% plus rapide quesed
pour les lignes Y commençant à X. Et commodément, vous n'avez pas à explicitementexit
le processus comme avecsed
.la source