Quelle est la meilleure façon (meilleure performance) de lire une ligne spécifique d'un fichier? Actuellement, j'utilise la ligne de commande suivante: ps.: Préférentiellement, à l'aide d'outils Shell. P> p>
6 Réponses :
Vous pouvez utiliser sed code>.
# print line number 10
$ sed -n '10p' file_name
$ sed '10!d' file_name
$ sed '10q;d' file_name
Sur mon système, votre dernier exemple est généralement plus rapide que les versions AWK, Head / Tail ou Ruby, à moins que la ligne ne soit proche de la fin du fichier. Seule la version Tail / Head commence à obtenir un peu plus vite car la ligne approche la fin du fichier.
awk -v linenum = 10 'nr == linenum {imprimé; EXIT} 'Fichier CODE> P>
Pourrait simplement utiliser awk nr == 10 nom_fichier code> comme dans ma réponse.
Si le fichier est énorme, vous ne voulez pas lire le reste de cela inutilement, alors sortez.
ruby -ne '$.==10 and (print; exit)' file
ruby -ne '$. == 10 et (impression; sortie)' code> sera plus rapide.
Si vous savez que les lignes ont la même longueur, un programme pourrait directement indiquer à cette ligne sans lire tous les précédents: quelque chose comme OD pourrait être capable de le faire, ou vous pourriez le coder en une demi-douzaine lignes dans la plupart des langues. Recherchez une fonction appelée Cherche () ou Fsek ().
Sinon, peut-être ... p> ... Comme cela demande la queue de passer à la nième ligne , et il y a moins de lignes placées inutilement à travers le tuyau qu'avec votre tête à la solution de la queue. p> p>
Cela devrait être tête 1 code> au lieu de
tête -1 code>.
@Dennis: Êtes-vous sûr? Avec toutes les implémentations de la tête que j'ai jamais vue la tête 1 code> essaierait de trouver un fichier appelé "1". J'ai vérifié deux fois sur GNU / Linux et c'est définitivement
tête -1 code>. Quelle version de la tête utilisez-vous?
Oh, désolé, gnu tête code> insiste sur
-n code> donc
tête -n 1 code>. J'ai frappé mon commentaire. Avec un
-n -1 code> gnu
tête code> sorties tout sauf la dernière ligne plutôt que juste la première. Version: tête (gnu cortitils) 7.4
@Denniswilliamson ahhh ... Je vois GNU Docs Reportez-vous à l'ancien -1 code> Syntaxe ALA "Option obsolète Syntaxe -Countoptions" ICI - mettra à jour à
-n 1 code>. À votre santé.
#print 10th line awk NR==10 file_name
J'ai essayé plusieurs fois d'éviter le cache de fichier et que la tête + la queue était rapide, mais le ruby était le plus rapide:
$ wc -l myfile.txt 920391 myfile.txt $ time awk NR==334227 myfile.txt my_searched_line real 0m14.963s user 0m1.235s sys 0m0.126s $ time head -334227 myfile.txt |tail -1 my_searched_line real 0m5.524s user 0m0.569s sys 0m0.725s $ time sed '334227!d' myfile my_searched_line real 0m12.565s user 0m0.814s sys 0m0.398s $ time ruby -ne '$.==334227 and (print; exit)' myfile my_searched_line real 0m0.750s user 0m0.568s sys 0m0.179s