2010-07-20 31 views
21

Estoy buscando un comando Unix para obtener una sola línea pasando el número de línea a un archivo grande (con alrededor de 5 millones de registros). Por ejemplo, para obtener la 10ma línea, quiero hacer algo comocomando unix para leer la línea de un archivo pasando el número de línea

command file-name 10 

¿Hay algún comando disponible? Podemos hacer esto pasando por cada registro, pero ese será un proceso lento.

Respuesta

39

Esto sugiere forum entry:

sed -n '52p' (file) 

imprimir la línea de 52th de un archivo.

+0

¿Por qué()? Eso le da a mi versión de bash un error, sin embargo, podría haber sido corregido en versiones posteriores. – Anders

+1

Quiere que reemplaces (archivo) con el archivo – Malfist

+3

Pude acelerar esto en un factor de diez (cuando se usa con un archivo de 100000 líneas) al salir después de imprimir: 'sed -n '52 {p; q} '' – Philipp

2
command | sed -n '10p' 

o

sed -n '10p' file 
3

Se podría hacer algo como:

head -n<lineno> <file> | tail -n1 

que le daría las líneas <lineno>, a continuación, sólo se dará la última línea de salida (la línea).

Editar: Parece que todas las soluciones aquí son bastante lentas. Sin embargo, por definición, tendrá que recorrer todos los registros, ya que el sistema operativo no tiene forma de analizar los archivos orientados a la línea, ya que los archivos están orientados por bytes. (En cierto sentido, todos estos programas van a hacer es contar el número de caracteres \n o \r.) En lugar de una gran respuesta, también presentaré los tiempos en mi sistema de varios de estos comandos.

[[email protected] ~]$ time sed -n '145430980p' br.txt 
0b10010011111111010001101111010111 

real 0m25.871s 
user 0m17.315s 
sys 0m2.360s 
[[email protected] ~]$ time head -n 145430980 br.txt | tail -n1 
0b10010011111111010001101111010111 

real 0m41.112s 
user 0m39.385s 
sys 0m4.291s 
[[email protected] ~]$ time awk 'NR==145430980{print;exit}' br.txt 
0b10010011111111010001101111010111 

real 2m8.835s 
user 1m38.076s 
sys 0m3.337s 

Por lo tanto, en mi sistema, parece que la solución sed -n '<lineno>p' <file> es más rápido!

1

puede usar awk

awk 'NR==10{print;exit}' file 

Deja una salida después de imprimir la línea 10 para que awk no procesará el archivo de 5 millones de discos más.

5

De ahora en adelante, hay muchas maneras de hacerlo y otras relacionadas.

Si desea que varias líneas a imprimir,

sed -n -e 'Np' -e 'Mp' 

donde N y M son las líneas que sólo se van a imprimir. Consulte esto 10 Awesome Examples for Viewing Huge Log Files in Unix

+1

¿Qué sucede si quiero más de un registro de 1000 líneas de archivo? ¿Cómo puedo pasar varias líneas en este comando? – Pooja25

Cuestiones relacionadas