varios todos subdirectorios renombrar para otro mover los listar directorios directorio crear copiar consola comando carpeta archivos archivo unix sed awk line-numbers text-extraction

unix - todos - mover varios archivos en linux



¿Cómo extraigo líneas de un archivo usando su número de línea en Unix? (6)

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 un número bastante grande de líneas que necesito extraer? Si tuviera un archivo con 100 líneas, cada una representando un número de línea que quisiera extraer de otro archivo, ¿cómo lo haría?


Algo así como "sed -n ''1p; 5p; 1010p; 20503p''. Ejecute el comando" man sed "para más detalles.

Para su segunda pregunta, transformaría el archivo de entrada en un conjunto de comandos sed (1) para imprimir las líneas que quería.


Investigaría Perl, ya que tiene las funciones de sed regular de sed más el modelo de programación que lo rodea para que pueda leer un archivo línea por línea, contar las líneas y extraer de acuerdo con lo que desee (incluso 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++; }


@OP, puede hacer esto de manera más fácil y más eficiente con awk. entonces para tu primera pregunta

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

para la 2da pregunta

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


Esto no es bonito y podría exceder los límites de longitud de comando en algunas circunstancias * :

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

O es un hermano mucho más lento pero más atractivo, y posiblemente más bien educado:

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

Una variacion:

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

Puedes acelerar un poco las versiones de xarg agregando la opción -P con un argumento grande como, digamos, 83 o quizás 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


con awk es tan simple como:

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