Преобразование чисел в файле CSV к их соответствующим URL

У меня есть файл CSV с двумя столбцами (и заголовок), где каждый из его элементов включает любое число между от 0 до 199. Я хочу преобразовать их в их соответствующие URL. Вот пример:

41,51

должен стать:

http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/41.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/51.jpg

Вот list.csv файл, который я хочу преобразовать:

$ head list.csv
imageA,imageB
41,51
172,100
99,149
83,72
84,160
186,8
93,198
150,21
63,102
3
задан 23 May 2018 в 10:00

3 ответа

Используя sed:

sed -r 's#^([0-9]+),([0-9]+)$#http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/\1\.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/\2\.jpg#' input-file
  • перенаправьте вывод в новый файл > output-file; или используйте опцию -i.bak внести изменения в их местах и создать файл резервной копии.
  • -r, --regexp-extended - используйте расширенные регулярные выражения в сценарии.
  • команда s замена средств: #<string-or-regexp>#<replacement>#.
  • # используется в качестве разделителя - обычно / играет эту роль, но здесь у нас есть много наклонные черты в <replacement>, таким образом мы не должны выходить из каждого из них.
  • ^ будет соответствовать к началу строки. $ будет соответствовать в конец строки.
  • [0-9]+ будет соответствовать к каждой строке, состоящей из цифр.
  • в <replacement>, группы получения ([0-9]+), будет рассматриваться как переменные \1 и \2.
  • \. просто Escape особого значения точки.

Вот упрощение, предложенное @dessert:

sed -r 's#([0-9]+)#http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/\1\.jpg#g' input-file
  • здесь мы предполагаем, что формат файла является гомогенным, как это находится в примере, и мы не должны соответствовать целой строке.
  • g флаг (в конце) повторяет замену на каждое возникновение подобранного regex в конец строки.

Кроме того, возможно использовать также переменные для базового URL и для расширения файла:

URL='http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/'; EXT='.jpg'
sed -r "s#([0-9]+)#$URL\1$EXT#g" input-file
  • Примечание: вот используемые метки двойной кавычки.
7
ответ дан 1 December 2019 в 12:58

Я, вероятно, использовал бы awk например.

awk -F, -v baseurl='http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/' '
  FNR>1 {printf("%s%d.jpg,%s%d.jpg\n", baseurl, $1, baseurl, $2)}
' list.csv
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/0.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/0.jpg
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/41.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/51.jpg
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/172.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/100.jpg
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/99.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/149.jpg
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/83.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/72.jpg
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/84.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/160.jpg
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/186.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/8.jpg
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/93.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/198.jpg
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/150.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/21.jpg
http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/63.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/102.jpg
6
ответ дан 1 December 2019 в 12:58

У меня есть код для Вас:

firstline=true
url_before_id=http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/
url_after_id=.jpg
for id in $(less list.csv)
do
  if $firstline;then
    firstline=false;echo $id
  else echo "$url_before_id${id%%,*}$url_after_id","$url_before_id${id##*,}$url_after_id"
  fi
done

или в одной строке

firstline=true;url_before_id=http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/;url_after_id=.jpg;for id in $(less list.csv);do if $firstline;then firstline=false;echo $id;else echo "$url_before_id${id%%,*}$url_after_id","$url_before_id${id##*,}$url_after_id";fi;done
1
ответ дан 1 December 2019 в 12:58

Другие вопросы по тегам:

Похожие вопросы: