2010-09-22 12 views
7

Qual è il modo migliore (prestazioni migliori) per leggere una riga specifica di un file? Attualmente, sto usando la seguente riga di comando:Lettura di una riga specifica di un file

head -line_number file_name | tail -1 

ps .: preferenzialmente, utilizzando gli strumenti shell.

risposta

6

È possibile utilizzare sed.

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

Sul mio sistema, il tuo ultimo esempio è generalmente più veloce rispetto alle versioni awk, testa/coda o rubino meno che la linea è vicino alla fine del file. Solo la versione coda/testa inizia a diventare un po 'più veloce mentre la linea si avvicina alla fine del file. –

3

awk -v linenum=10 'NR == linenum {print; exit}' file

+0

Potrebbe semplicemente usare 'awk NR == 10 file_name' come nella mia risposta. – dogbane

+0

Se il file è enorme, non vuoi leggere il resto inutilmente, quindi esci. –

0
ruby -ne '$.==10 and (print; exit)' file 
+0

'ruby -ne '$. == 10 e (print; exit)'' sarà più veloce. –

2

Se si conoscono le linee sono della stessa lunghezza, poi un programma potrebbe direttamente indice in quella linea senza leggere tutti quelli che precedono: qualcosa di simile od potrebbe essere in grado di fare questo, o potresti codificarlo in una mezza dozzina di righe nella maggior parte delle lingue. Cerca una funzione chiamata seek() o fseek().

Altrimenti, forse ...

tail +N | head -n 1 

... come questo chiede coda per saltare alla linea ennesimo, e ci sono meno linee messo inutilmente attraverso il tubo che con la testa a coda soluzione.

+0

Questo dovrebbe essere "testa 1" invece di "testa -1". –

+0

@Dennis: sei sicuro? Con tutte le implementazioni principali che abbia mai visto, 'head 1 'proverebbe a trovare un file chiamato" 1 ". Ho ricontrollato su GNU/Linux ed è decisamente 'testa -1'. Quale versione di testa usi? –

+0

Oh, mi dispiace, GNU 'head' insiste su' -n' quindi 'head -n 1'. Ho scritto il mio commento. Con un '-n -1' GNU' head' restituisce tutto tranne l'ultima riga piuttosto che solo la prima. Versione: head (GNU coreutils) 7.4 –

4
#print 10th line 
awk NR==10 file_name 
Problemi correlati