¿Cómo puedo extraer un rango predeterminado de líneas de un archivo de texto en Unix?
Tengo un volcado SQL de ~ 23000 líneas que contiene datos de varias bases de datos. Necesito extraer una determinada sección de este archivo (es decir, los datos de una única base de datos) y colocarla en un archivo nuevo. Conozco los números de línea inicial y final de los datos que deseo.
¿Alguien conoce un comando de Unix (o una serie de comandos) para extraer todas las líneas de un archivo entre, por ejemplo, las líneas 16224 y 16482 y luego redirigirlas a un nuevo archivo?
sed -n '16224,16482p;16483q' filename > newfile
Del manual de sed :
p - Imprime el espacio del patrón (en la salida estándar). Este comando generalmente solo se usa junto con la opción de línea de comando -n.
n : si la impresión automática no está desactivada, imprima el espacio del patrón y luego, independientemente, reemplace el espacio del patrón con la siguiente línea de entrada. Si no hay más entradas, entonces sed sale sin procesar más comandos.
q - Salir
sed
sin procesar más comandos o entradas. Tenga en cuenta que el espacio del patrón actual se imprime si la impresión automática no está desactivada con la opción -n.
y
Las direcciones en un script sed pueden tener cualquiera de las siguientes formas:
número Al especificar un número de línea, solo coincidirá con esa línea en la entrada.
Se puede especificar un rango de direcciones especificando dos direcciones separadas por una coma (,). Un rango de direcciones coincide con líneas que comienzan desde donde coincide la primera dirección y continúa hasta que coincide la segunda dirección (inclusive).
sed -n '16224,16482 p' orig-data-file > new-file
Donde 16224,16482 son el número de línea inicial y el número de línea final, ambos inclusive. Esto está indexado en 1. -n
suprime el eco de la entrada como salida, lo que claramente no desea; los números indican el rango de líneas sobre las que operar el siguiente comando; el comando p
imprime las líneas relevantes.
Bastante simple usando cabeza/cola:
head -16482 in.sql | tail -258 > out.sql
usando sed:
sed -n '16224,16482p' in.sql > out.sql
usando awk:
awk 'NR>=16224&&NR<=16482' in.sql > out.sql