Pregunta

Usando sed o similar, ¿cómo extraerías líneas de un archivo?Si quisiera las líneas 1, 5, 1010, 20503 de un archivo, ¿cómo obtendría estas 4 líneas?

¿Qué pasa si tengo una cantidad bastante grande de líneas que necesito extraer?Si tuviera un archivo con 100 líneas, cada una de las cuales representara un número de línea que quisiera extraer de otro archivo, ¿cómo lo haría?

¿Fue útil?

Solución

Algo así como "sed -n '1p; 5p; 1010P; 20503p'. Ejecutar la orden " hombre sed" para obtener más información

En su segunda pregunta, me gustaría transformar el archivo de entrada en un montón de sed (1) comandos para imprimir las líneas que quería.

Otros consejos

con awk Es tan simple como:

awk 'NR==1 || NR==5 || NR==1010' "file"

@OP, puedes hacer esto más fácil y eficientemente con awk.entonces para tu primera pregunta

awk 'NR~/^(1|2|5|1010)$/{print}' file

para la segunda pregunta

awk 'FNR==NR{a[$1];next}(FNR in a){print}' file_with_linenr file

Me investigar Perl, ya que cuenta con las instalaciones de expresiones regulares de sed más el modelo de programación que lo rodea para que pueda leer un archivo línea por línea, el recuento de las líneas y extracto de acuerdo a lo que quiere (que incluye desde un archivo de números de línea).

my $row = 1
while (<STDIN>) {
   # capture the line in $_ and check $row against a suitable list.
   $row++;
}

Esto no es bastante y podría superar los límites de longitud de mando bajo algunas circunstancias * :

sed -n "$(while read a; do echo "${a}p;"; done < line_num_file)" data_file

O es mucho más lento, pero más atractivo, y posiblemente más de buen comportamiento, hermano:

while read a; do echo "${a}p;"; done < line_num_file | xargs -I{} sed -n \{\} data_file

Una variación:

xargs -a line_num_file -I{} sed -n \{\}p\; data_file

Puede acelerar las versiones xarg un poco añadiendo la opción -P con algún gran argumento como, digamos, 83 o tal vez 419 o incluso 1177, pero 10 parece tan bueno como cualquier otro.

* xargs --show-limits </dev/null puede ser instructivo

En Perl:

perl -ne 'print if $. =~ m/^(1|5|1010|20503)$/' file
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top