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"