leer el rango especificado de líneas de un archivo

15

Tengo un archivo que contiene 100000 líneas, cómo puedo obtener las líneas de la línea # 5555 a la línea # 7777 en Linux.

Gracias por todo.


fuente
1
@ibrahim, considera aceptar la respuesta de Kyle (marcando la marca de verificación verde a la izquierda) si te ayudó
Jonik
puede precisar si desea usar sed o si otras herramientas están bien.
Manu H
Un poco de investigación arroja al menos stackoverflow.com/questions/83329/…
sancho.s Restablece a Mónica el

Respuestas:

22
sed '5555,7777!d' <filename>

Esto imprimirá las líneas 5555-7777 del archivo inclusive.

Dennis publicó lo siguiente que acepto debería ser más rápido:

sed '5555,7777p; 7778q' filename

La siguiente evidencia de que debería ser más rápido:

$ n=1
$ while [[ n -le 100000 ]]; do echo $n >> sedtest2; n=$((n + 1)); done
$ strace -e trace=read -o sed1 sed '5555,7777!d' sedtest2
$ strace -e trace=read -o sed2 sed '5555,7777p; 7778q' sedtest2
$ wc -l sed1
149 sed1
$ wc -l sed2
14 sed1

Solo en Bash (por diversión):

n=1
while read line; do 
    if [[ ($n -ge 5555) && ($n -le 7777)  ]]; then 
        echo $line
    elif [[ $n -gt 7777 ]]; then
        break
    fi 
    n=$(( $n + 1 ))
done < file
Kyle Brandt
fuente
Creo que tu $n -gt 3deberías ser 7777 quizás? Además, puede hacerlo if (( n >= 5555 ))para operadores de comparación numéricos de aspecto más "natural" (y la capacidad de omitir el signo de dólar). Y tu puedes hacer ((n++)).
Pausado hasta nuevo aviso.
16

Dejar de fumar cuando haya terminado puede acelerar las cosas:

sed -n '5555,7777p; 7778q' input_file
Pausado hasta nuevo aviso.
fuente
1
+1, debería ser más rápido, actualicé mi publicación para mostrar por qué.
Kyle Brandt el
7

Cualquiera de estos debería funcionar;

  • sed -n 'número inicial , número final p'
  • awk 'NR> = número de inicio && NR <= número de final ' archivo

Gran pregunta por cierto;)

Chopper3
fuente
1

Descubrí que la opción sed no funcionaba en un archivo mysqldump, supongo que debido al manejo de los saltos de línea entre comillas o caracteres multibyte. la cabeza y la cola lo cortan usando los mismos números de línea que grep, que era lo que necesitaba. Para obtener las líneas $ j a $ k, necesita:

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
Dave Crooke
fuente