Как удалить последние слова после указанного c слова (.com) в первой строке и разбить числа на следующую строку с помощью команды оболочки script / awk / gawk / sed - PullRequest
1 голос
/ 27 мая 2020

У меня есть образец файла csv ниже.

  • Необходимо удалить последние слова после .com в первом столбце (Host).
  • Если в первом столбце есть какое-либо число (хост) этот номер должен быть напечатан во втором столбце (порт).
  • Удалите http // и https: //
  • Полный файл почти 12 КБ, здесь я приложил образец.

Образец файла csv

    Host                                                             Port
https://abcd03.face.op.api.example.com/v1/authent/token?grant_type,443 
https://defghu04.core.op.api.example.com/hello1/v4/tokens,443
https://abcdo3.xyz.def.tata.com/v1/xyz/accesstoken?grant_type,443
https://abcdef.clever.api.sell.com/samsung/v1/managements/autoPayments,443
https://abcdefe.orsd.api.ssample.com/auth/v1/customer-management/interacting,443
http://century.test.ext.sample.com:6102/ABC1/Genereate/CreditSale,80
http://century.test.ext.extra.com:6102/ABC2/proxy/sales,80
http://century.test.ext.sell.com:6550/commerce/1.x/transactionProcessor,80
https://century.test.ext.basic.com:6446/tokenize,443
https://sell.test.ext.state.com:6446/transfer,443
https://century.test.ext.sell.com:6446/delete,443

Ожидаемый результат:

abcd03.face.op.api.example.com,443
defghu04.core.op.api.example.com,443
abcdo3.xyz.def.tata.com,443
abcdef.clever.api.sell.com,443
abcdefe.orsd.api.ssample.com,443
century.test.ext.sample.com,6102
century.test.ext.extra.com,6102
century.test.ext.sell.com,6550
century.test.ext.basic.com,6446
sell.test.ext.state.com,6446
century.test.ext.sell.com,6446

Заранее благодарим за помощь.

Ответы [ 3 ]

3 голосов
/ 27 мая 2020

Учитывая, что ваш фактический файл Input_file будет таким же, как и в показанных примерах, не могли бы вы попробовать следующее.

awk '
BEGIN{
  FS=OFS=","
}
match($0,/\/\/.*\.com:[0-9]+/){
  val=substr($0,RSTART+2,RLENGTH-2)
  sub(/:/,",",val)
  print val
  next
}
match($0,/\/\/.*\.com[^/]*/){
  val=substr($0,RSTART+2,RLENGTH-2)
  print val,$NF
}
'  Input_file

Объяснение: Добавление подробного объяснения выше.

awk '                                      ##Starting awk program from here.
BEGIN{                                     ##Starting BEGIN section from here.
  FS=OFS=","                               ##Setting FS and OFS as comma here.
}
match($0,/\/\/.*\.com:[0-9]+/){            ##Matching from // to till .com digits then if match found then do following.
  val=substr($0,RSTART+2,RLENGTH-2)        ##Creating val which has sub-string of matched value above.
  sub(/:/,",",val)                         ##Substituting colon with comma here in val.
  print val                                ##Printing val here.
  next                                     ##next will skip all further statements.
}
match($0,/\/\/.*\.com[^/]*/){              ##Matching from // to .com here, followed by /
  val=substr($0,RSTART+2,RLENGTH-2)        ##Creating val which has sub-string of current line.
  print val,$NF                            ##Printing val and last field here.
}
' Input_file                               ##Mentioning Input_file name here.
2 голосов
/ 27 мая 2020

Это может сработать для вас (GNU sed):

sed -E 's#^https?://##;s#/[^,]*##;s/:([^,]*).*/,\1/' file

Удалить переднюю строку.

Удалить среднюю строку.

Удалить второй столбец, если порт уже присутствует.

См. здесь для демонстрации.

Альтернатива:

sed -E 's#^https?://(([^:]*):([^/]*).*(,).*|([^/]*)/.*(,.*))#\2\4\3\5\6#' file
2 голосов
/ 27 мая 2020

С bash, пожалуйста, попробуйте:

while IFS=, read -r url port; do
    if [[ $url =~ https?://([^/:]+)(:([0-9]+))? ]]; then
        [[ -n ${BASH_REMATCH[3]} ]] && port="${BASH_REMATCH[3]}"
        # if the port number is included in the url, replace the 2nd field with it
        echo "${BASH_REMATCH[1]},$port"
    fi
done < file.csv

Вывод:

abcd03.face.op.api.example.com,443
defghu04.core.op.api.example.com,443
abcdo3.xyz.def.tata.com,443
abcdef.clever.api.sell.com,443
abcdefe.orsd.api.ssample.com,443
century.test.ext.sample.com,6102
century.test.ext.extra.com,6102
century.test.ext.sell.com,6550
century.test.ext.basic.com,6446
sell.test.ext.state.com,6446
century.test.ext.sell.com,6446
...