Convertendo números em um arquivo CSV para seus URLs correspondentes

3

Eu tenho um arquivo CSV com duas colunas (e um cabeçalho) onde cada um dos seus elementos inclui qualquer número entre 0 e 199. Quero convertê-los em URLs correspondentes. Aqui está um exemplo:

41,51

deve se tornar:

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

Aqui está o arquivo list.csv que eu quero converter:

$ head list.csv
imageA,imageB
41,51
172,100
99,149
83,72
84,160
186,8
93,198
150,21
63,102
    
por Mona Jalal 22.05.2018 / 19:06

3 respostas

7

Usando sed :

sed -r 's#^([0-9]+),([0-9]+)$#http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/\.jpg,http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/\.jpg#' input-file
  • redireciona a saída para um novo arquivo > output-file ; ou use a opção -i.bak para fazer as alterações em seus locais e criar um arquivo de backup.
  • -r , --regexp-extended - use expressões regulares estendidas no script.
  • o comando s significa substituto: #<string-or-regexp>#<replacement># .
  • # é usado como delimitador - geralmente / desempenha esse papel, mas aqui temos muitas barras dentro do <replacement> , portanto, não precisamos escapar de cada uma delas.
  • ^ corresponderá ao início da linha. $ corresponderá ao final da linha.
  • [0-9]+ corresponderá a cada string que consiste em dígitos.
  • dentro do <replacement> , os grupos de captura ([0-9]+) serão tratados como as variáveis e .
  • \. é apenas um escape do significado especial do ponto.

Aqui está uma simplificação proposta por @dessert :

sed -r 's#([0-9]+)#http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/\.jpg#g' input-file
  • aqui, assumimos que o formato do arquivo é homogêneo, como no exemplo, e não precisamos corresponder à linha inteira.
  • o sinal g (no final) repete a substituição de cada ocorrência da regex correspondida ao final da linha.

Além disso, é possível usar também variáveis para o URL base e para a extensão do arquivo:

URL='http://www.cs.bu.edu/~betke/research/vc-crowd/MSCOCO/'; EXT='.jpg'
sed -r "s#([0-9]+)#$URL$EXT#g" input-file
  • Nota: aqui são usadas aspas duplas.
por pa4080 22.05.2018 / 19:21
6

Eu provavelmente usaria awk , por exemplo,

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
    
por steeldriver 22.05.2018 / 19:31
1

Eu tenho um código para você:

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

ou em uma linha

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
    
por Boba Fit 22.05.2018 / 19:17