10
votes

Lire une ligne spécifique d'un fichier

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: xxx

ps.: Préférentiellement, à l'aide d'outils Shell.


0 commentaires

6 Réponses :


10
votes

Vous pouvez utiliser sed code>.

# print line number 10
$ sed -n '10p' file_name
$ sed '10!d' file_name
$ sed '10q;d' file_name


1 commentaires

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.



3
votes

awk -v linenum = 10 'nr == linenum {imprimé; EXIT} 'Fichier


2 commentaires

Pourrait simplement utiliser awk nr == 10 nom_fichier comme dans ma réponse.


Si le fichier est énorme, vous ne voulez pas lire le reste de cela inutilement, alors sortez.



1
votes
ruby -ne '$.==10 and (print; exit)' file

1 commentaires

ruby ​​-ne '$. == 10 et (impression; sortie)' sera plus rapide.



2
votes

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 ... xxx

... 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.


4 commentaires

Cela devrait être tête 1 au lieu de tête -1 .


@Dennis: Êtes-vous sûr? Avec toutes les implémentations de la tête que j'ai jamais vue la tête 1 essaierait de trouver un fichier appelé "1". J'ai vérifié deux fois sur GNU / Linux et c'est définitivement tête -1 . Quelle version de la tête utilisez-vous?


Oh, désolé, gnu tête insiste sur -n donc tête -n 1 . J'ai frappé mon commentaire. Avec un -n -1 gnu tête 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 Syntaxe ALA "Option obsolète Syntaxe -Countoptions" ICI - mettra à jour à -n 1 . À votre santé.



5
votes
#print 10th line
awk NR==10 file_name

0 commentaires

0
votes

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


0 commentaires