Доступ к каждой строке в .txt-файле, загрузка и переименование ссылок

Предположим, у меня есть .txt-файл, где у меня есть список ссылок на изображения, которые я хочу загрузить. пример:

image.jpg image2.jpg image3.jpg 

Я использую: cat images.txt | xargs wget cat images.txt | xargs wget и работает отлично

Теперь я хочу предоставить другой .txt-файл в следующем формате:

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

То, что я хочу сделать, – разделить каждую строку на «», загрузить ссылку вправо и изменить загруженное имя файла с идентификатором, указанным слева.

Я хочу как-то использовать wget image.jpg -O some_id1.jpg для каждой отдельной строки.

Таким образом, выход будет:

 some_id1.jpg some_id2.jpg some_id3.jpg 

Есть идеи ?

3 Solutions collect form web for “Доступ к каждой строке в .txt-файле, загрузка и переименование ссылок”

Это может сделать вашу работу,

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

Тестировать:

 $ 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 

Чтобы запустить, перейдите в bash или sh так:

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

Добавьте одиночные кавычки в оператор печати, если это необходимо (например, если поля разделены вкладками, а поля могут содержать пробелы или другие символы, которые являются проблематичными для оболочки, или если поле 2 представляет собой полный URL-адрес с амперсандами & , полуколонами и т. Д. ). например

 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' 

BTW, вот как вы вставляете одиночные кавычки в строки с одним кавычком: '\'' (конец одиночной кавычки, обратная косая черта с одиночной кавычкой, снова начинайте одну кавычку)


Дополнительная информация:

1. Возможно, вам придется выполнить дополнительную обработку на $2 (с функцией gsub() awk) перед оператором print если есть вероятность, что $ 2 может содержать один или несколько апострофов. например

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

Этот почти нечитаемый беспорядок одиночных кавычек, двойных кавычек, слэшей и обратных косых черт преобразует все во втором поле в '\'' . Иногда цитата может быть реальной болью (хотя она не была бы столь же уродливой в сценарии #!/usr/bin/awk -f а не в одиночном кавычке).

2. В качестве альтернативы, если $2 – это URL, возможно, стоит вместо этого заменить одно кавычки на %27 , что является кодировкой сущности URL для апострофа. Оболочка не заботится о символах%, конечно, не в том случае, если они находятся внутри одиночных кавычек, но это много заботится о котировках.

Аналогично, вы можете исключить все символы пунктуации при извлечении .extension. например

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

ЗАМЕЧАНИЕ, однако, что это может стать довольно сложным, в зависимости от того, где и как внедрено имя файла изображения, например URL.

Использование awk:

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

Сломать

  1. Сначала мы используем awk для распечатки примерно той команды, которую хотим:

     awk '{printf("wget -O %s %s\n", $1, $2)}' images.txt 
  2. Затем мы извлекаем расширение, разбивая URL на '.' и добавьте его к первому аргументу:

     awk '{split($2, p, "."); printf("wget -O %s.%s %s\n", $1, p[length(p)], $2)}' images.txt 
  3. Наконец, мы меняем printf на sprintf, а wrap – в системной команде, чтобы заставить awk выполнить команду:

     awk '{split($2, p, "."); system(sprintf("wget -O %s.%s %s\n", $1, p[length(p)], $2))}' images.txt 
  • Почему xargs вырезает цитаты из ввода?
  • Найдите файлы с определенным форматом файлов, коту, каждый с файлом заголовка, и сохраните результат в исходный файл для каждого такого файла
  • xargs, записи и стандартный ввод
  • Найти файлы рекурсивно, которые старше одного года и не принадлежат конкретному пользователю
  • Пустые строки при выполнении «grep | xargs "в" find -exec "
  • Найти -exec + vs find | xargs. Какой из них выбрать?
  • cp после того, как xargs не работает
  • Применение функции bash для каждого файла в подпапке рекурсивно
  • Как заставить xargs играть хорошо с stdin?
  • Переформатирование большого количества XML-файлов
  • xargs: запуск команды один раз со всеми аргументами
  • Linux и Unix - лучшая ОС в мире.