¿Cómo puedo extraer un rango predeterminado de líneas de un archivo de texto en Unix?

Resuelto Adam J. Forster asked hace 16 años • 28 respuestas

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?

Adam J. Forster avatar Sep 17 '08 20:09 Adam J. Forster
Aceptado
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 sedsin 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).

boxxar avatar Sep 17 '2008 13:09 boxxar
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. -nsuprime 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 pimprime las líneas relevantes.

JXG avatar Sep 17 '2008 13:09 JXG

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
manveru avatar Sep 17 '2008 13:09 manveru