Accediendo a cada línea en el file .txt, descargue y cambie el nombre de los enlaces

Digamos que tengo un file .txt donde tengo una list de enlaces de image que deseo download. ejemplo:

image.jpg image2.jpg image3.jpg 

Yo uso: cat images.txt | xargs wget cat images.txt | xargs wget y funciona bien

Lo que quiero hacer ahora es proporcionar otro file .txt con el siguiente formatting:

 some_id1 image.jpg some_id2 image2.jpg some_id3 image3.jpg 

Lo que quiero hacer es dividir cada línea en '', download el enlace a la derecha y cambiar el nombre de file descargado con la identificación proporcionada a la izquierda.

Quiero de alguna manera usar wget image.jpg -O some_id1.jpg para cada línea por separado.

Entonces la salida será:

 some_id1.jpg some_id2.jpg some_id3.jpg 

Algunas ideas ?

Esto podría hacer tu trabajo,

 while read ab do wget "$b" -O "$a".jpg printf "$a".jpg"\n%s" >> newfile done < images.txt 

Probar:

 $ awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1); print "wget " $2 " -O " $1 ext}' images.txt wget image.jpg -O some_id1.jpg wget image2.jpg -O some_id2.jpg wget image3.jpg -O some_id3.jpg 

Para ejecutar, canaliza en bash o sh como así:

 awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1); print "wget " $2 " -O " $1 ext}' images.txt | bash 

Agregue comillas simples en la statement de printing si es necesario (por ejemplo, si los campos están separados por tabs y los campos pueden contener espacios u otros caracteres problemáticos para el shell, o si el campo 2 es una URL completa con signos & , signos y puntos ; etc. ) p.ej

 awk '{ ext=gensub(/.*(\.[^.]*$)/,"\\1",1); print "wget '\''" $2 "'\'' -O '\''" $1 ext"'\''"}' images.txt wget 'image.jpg' -O 'some_id1.jpg' wget 'image2.jpg' -O 'some_id2.jpg' wget 'image3.jpg' -O 'some_id3.jpg' 

Por cierto, así es como insertas comillas simples en cadenas entre comillas simples: '\'' (comilla simple final, una comilla simple escapada en barra invertida, comience una comilla simple otra vez)


Información extra:

1. Es posible que deba realizar un procesamiento adicional de $2 (con la function gsub() awk) antes de la instrucción de print si existe la posibilidad de que $ 2 pueda contener uno o más apóstrofos. p.ej

 gsub(/'\''/,"'"'\\\\''"'",$2); 

Ese lío casi ilegible de comillas simples, comillas dobles, barras inclinadas y barras diagonales inversas transforma todo en el segundo campo en '\'' . Citar puede ser un verdadero dolor a veces (aunque no sería tan feo en una secuencia de commands #!/usr/bin/awk -f lugar de una frase única).

2. Alternativamente, si $2 es una URL, podría valer la pena cambiar las comillas simples a %27 , que es la encoding de la entidad URL para un apóstrofo. Al shell no le importan los% símbolos, ciertamente no si están dentro de comillas simples, pero le preocupan mucho las comillas.

Del mismo modo, es posible que desee excluir todos los caracteres de puntuación al extraer la .extensión. p.ej

 ext=gensub(/.*(\.[^[:punct:]]*)/,"\\1",1); 

Sin embargo, tenga en count que esto puede ser bastante complicado, dependiendo de dónde y cómo está embedded el nombre de file de la image, por ejemplo, una URL.

Usando awk:

 awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt 

Descompostura

  1. Primero usamos awk para imprimir más o less el command que queremos:

     awk '{printf("wget -O %s %s\n", $1, $2)}' images.txt 
  2. Luego extraemos la extensión dividiendo la URL en '.' y añádalo al primer argumento:

     awk '{split($2, p, "."); printf("wget -O %s.%s %s\n", $1, p[length(p)], $2)}' images.txt 
  3. Finalmente, cambiamos el printf a sprintf y wrap está en un command del sistema para hacer que awk ejecute el command:

     awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt