Solución 1:
sed -n '10000000,10000020p' filename
Es posible que pueda acelerarlo un poco así:
sed -n '10000000,10000020p; 10000021q' filename
En esos comandos, la opción -n
causas sed
para "suprimir la impresión automática del espacio patrón". El p
comando "imprimir[s] el espacio del patrón actual" y el q
comando "Salga inmediatamente del script sed sin procesar más entradas..." Las comillas son del sed
man
página.
Por cierto, su comando
tail -n 10000000 filename | head 10
comienza en la línea diez millonésima desde el final del archivo, mientras que su comando "medio" parecería comenzar en el diezmillonésimo desde el principio que sería equivalente a:
head -n 10000010 filename | tail 10
El problema es que para archivos sin ordenar con líneas de longitud variable, cualquier proceso tendrá que pasar por el archivo contando nuevas líneas. No hay forma de atajar eso.
Sin embargo, si el archivo está ordenado (un archivo de registro con marcas de tiempo, por ejemplo) o tiene líneas de longitud fija, puede buscar en el archivo en función de una posición de byte. En el ejemplo del archivo de registro, puede realizar una búsqueda binaria para un rango de veces como lo hace mi secuencia de comandos de Python aquí*. En el caso del archivo de longitud de registro fijo, es realmente fácil. Solo buscas linelength * linecount
caracteres en el archivo.
Solución 2:
Descubrí el siguiente uso de sed
sed -n '10000000,+20p' filename
¡Espero que sea útil para alguien!
Solución 3:
¡Es mi primera vez publicando aquí! De todos modos, este es fácil. Digamos que desea extraer la línea 8872 de su archivo llamado file.txt. Así es como lo haces:
gato -n archivo.txt | grep '^ *8872'
Ahora la pregunta es encontrar 20 líneas después de esto. Para lograr esto haces
gato -n archivo.txt | grep -A 20 '^ *8872'
Para las líneas alrededor o antes de ver los indicadores -B y -C en el manual de grep.