заменить часть URL из нескольких ячеек в файле CSV в каждой строке - PullRequest
2 голосов
/ 26 марта 2019

У меня есть файл CSV ниже.Я хотел бы иметь возможность преобразовать его, чтобы у меня были идентификаторы без URL-адресов.

tID,type,usageID,Usage,status,tStatus,proParte,sName,snID,canName,scAuth,pnuID,tRank,trSort,King,class,subclass,family,created,modified,datasetName,tcID,Ref,refID,tRemarks,tDist,hClass,fhpName,fhpnID,shpn,shpnID,nomCode,Lic,ccaID
https://some-url.com/tree/90000607/90000610,scientific,https://some-url.com/tree/90000607/90000610,Bacteria,,accepted,f,Bacteria,https://some-url.com/name/bbni/90000608,Bacteria,,,Regnum,10,Bacteria,,,,2018-12-06 14:48:14.395+11,2018-12-06 14:48:14.708+11,BBC,https://some-url.com/instance/bbni/90000609,TWD,https://some-url.com/reference/bbni/90000596,,,Bacteria,,,,,ABC,-,/tree/90000607/90000610

Я хотел бы добиться одного из двух следующих результатов.Я пробовал разные вещи, используя sed piping несколько раз, но я не могу сделать это одной командой, используя regEx.

Опция 1:

tID,type,usageID,Usage,status,tStatus,proParte,sName,snID,canName,scAuth,pnuID,tRank,trSort,King,class,subclass,family,created,modified,datasetName,tcID,Ref,refID,tRemarks,tDist,hClass,fhpName,fhpnID,shpn,shpnID,nomCode,Lic,ccaID
tree/90000607/90000610,scientific,tree/90000607/90000610,Bacteria,,accepted,f,Bacteria,name/bbni/90000608,Bacteria,,,Regnum,10,Bacteria,,,,2018-12-06 14:48:14.395+11,2018-12-06 14:48:14.708+11,BBC,instance/bbni/90000609,TWD,reference/bbni/90000596,,,Bacteria,,,,,ABC,-,/tree/90000607/90000610

Вариант 2:

tID,type,usageID,Usage,status,tStatus,proParte,sName,snID,canName,scAuth,pnuID,tRank,trSort,King,class,subclass,family,created,modified,datasetName,tcID,Ref,refID,tRemarks,tDist,hClass,fhpName,fhpnID,shpn,shpnID,nomCode,Lic,ccaID
90000610,scientific,90000610,Bacteria,,accepted,f,Bacteria,90000608,Bacteria,,,Regnum,10,Bacteria,,,,2018-12-06 14:48:14.395+11,2018-12-06 14:48:14.708+11,BBC,90000609,TWD,90000596,,,Bacteria,,,,,ABC,-,90000610

Если кто-то может помочь с тем, что вы сделали раньше, это поможет мне.

Вещи, которые я попробовал:

#!/bin/bash
sed -e 's/[a-z]*:\/\/[a-z]*.[a-z]*.[a-z]*\/[a-z]*\/[a-z]*\/[a-z]*\/[a-z]*//g' BBC-taxon-2019-03-26-4546.csv > test.csv
sed -e 's/[0-9]\/[0-9]/[0-9]|[0-9]/g' test.csv

Над кодом необходимо написать команду для каждого типа замены и каждый раз создавать новый файл, поэтому я отказался.

#!/bin/bash
# Set Input File here...
input="BBC-taxon-2019-03-26-4546.csv"

# Check if file exists
[ ! -f $input ] && { echo "No file with name: $input. File not found"; exit 123; }

# Set file separator and read fields into variables
while IFS=',' read -ra fields;
do
  echo "Fields: ${fields[*]}"
  echo "Number of Elements: ${#fields[@]}"
  echo "Each Element has: ${#fields}"
  for i in "${fields[@]}"
  do
    echo $i
  done

#  fields[0] = ${fields[0]} 
done < "$input"

Приведенный выше код создает итеративный массив, но я не знаю, как использовать sed в каждой ячейке значения для определенного столбца.Если кто-то может помочь, это здорово.

Ответы [ 3 ]

1 голос
/ 26 марта 2019

Ввод:

tID,type,usageID,Usage,status,tStatus,proParte,sName,snID,canName,scAuth,pnuID,tRank,trSort,King,class,subclass,family,created,modified,datasetName,tcID,Ref,refID,tRemarks,tDist,hClass,fhpName,fhpnID,shpn,shpnID,nomCode,Lic,ccaID
https://some-url.com/tree/90000607/90000610,scientific,https://some-url.com/tree/90000607/90000610,Bacteria,,accepted,f,Bacteria,https://some-url.com/name/bbni/90000608,Bacteria,,,Regnum,10,Bacteria,,,,2018-12-06 14:48:14.395+11,2018-12-06 14:48:14.708+11,BBC,https://some-url.com/instance/bbni/90000609,TWD,https://some-url.com/reference/bbni/90000596,,,Bacteria,,,,,ABC,-,/tree/90000607/90000610

Для опция 1 использование:

sed -E 's@(https?://[^,/]+)?(/[^/]+/[^/]+/[0-9]+)@\2@g' input.csv 
tID,type,usageID,Usage,status,tStatus,proParte,sName,snID,canName,scAuth,pnuID,tRank,trSort,King,class,subclass,family,created,modified,datasetName,tcID,Ref,refID,tRemarks,tDist,hClass,fhpName,fhpnID,shpn,shpnID,nomCode,Lic,ccaID
/tree/90000607/90000610,scientific,/tree/90000607/90000610,Bacteria,,accepted,f,Bacteria,/name/bbni/90000608,Bacteria,,,Regnum,10,Bacteria,,,,2018-12-06 14:48:14.395+11,2018-12-06 14:48:14.708+11,BBC,/instance/bbni/90000609,TWD,/reference/bbni/90000596,,,Bacteria,,,,,ABC,-,/tree/90000607/90000610

Для опция 2 использование:

sed -E 's@(https?://[^,]+|(/[^,/]+)+)/([0-9]+)@\3@g' input.csv 
tID,type,usageID,Usage,status,tStatus,proParte,sName,snID,canName,scAuth,pnuID,tRank,trSort,King,class,subclass,family,created,modified,datasetName,tcID,Ref,refID,tRemarks,tDist,hClass,fhpName,fhpnID,shpn,shpnID,nomCode,Lic,ccaID
90000610,scientific,90000610,Bacteria,,accepted,f,Bacteria,90000608,Bacteria,,,Regnum,10,Bacteria,,,,2018-12-06 14:48:14.395+11,2018-12-06 14:48:14.708+11,BBC,90000609,TWD,90000596,,,Bacteria,,,,,ABC,-,90000610

добавить параметр -i.bak для непосредственного изменения входного файла (встроенный режим), будет создан резервный файл .bak

0 голосов
/ 15 апреля 2019

если ваши данные в файле 'd', попробуйте gnu sed
1-я строка не печатает дерево и число, 2-я печатает его, потому что у него \ 1 при замене.

sed -Ez 's#\bhttps://[^/]+/tree/\w+/##g ' d
sed -Ez 's#\bhttps://[^/]+(/tree/\w+/)#\1#g ' d
0 голосов
/ 26 марта 2019

Если вы знаете, что каждая вещь, которую вы пытаетесь проанализировать, является URL-адресом и не будет конфликтовать с другими полями данных, почему бы не использовать регулярное выражение для точной строки URL-адреса?как это:

sed -e 's/http[s]:\/\/.*\.com//g' test.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...