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

#linux #bash #shell #sed

#linux #bash #оболочка #sed

Вопрос:

У меня есть приведенный ниже 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 ] amp;amp; { 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 для каждой ячейки значения для определенного столбца. Если кто-нибудь может помочь, это здорово.

Комментарии:

1. Не могли бы вы, пожалуйста, немного объяснить, какое значение (или часть строки) вы хотите удалить (или заменить на что) это действительно длинная строка, и, увидев опции 1 и 2, значение 90000607 , например, не найдено в исходной строке, так что предполагается, что это результат какой-то замены?

2. Пожалуйста, проверьте сейчас. Извините, проблема с копированием и вставкой.

3. Всегда ли URL-адрес находится в одном и том же месте в csv? Тот же столбец?

4. Должны ли другие поля содержать косые черты? Если нет, sed 's/[^,]*//g' file будет работать.

Ответ №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
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

Ответ №2:

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

 sed -e 's/http[s]://.*.com//g' test.csv
  

Комментарии:

1.URL-адреса содержат разные строки. https://some-url.com/tree/90000607/90000610 https://some-url.com/name/bbni/90000608 https://some-url.com/instance/bbni/90000609 https://some-url.com/reference/bbni/90000596

Ответ №3:

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

 sed -Ez 's#bhttps://[^/] /tree/w /##g ' d
sed -Ez 's#bhttps://[^/] (/tree/w /)#1#g ' d