首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理包含URL的CSV文件,用显式声明的端口替换可能出错的“默认”端口

处理包含URL的CSV文件,用显式声明的端口替换可能出错的“默认”端口
EN

Unix & Linux用户
提问于 2020-05-12 06:16:17
回答 1查看 74关注 0票数 1

我在CSV文件中有URL/port语句,其中一些端口语句是错误的“默认值”。

样本输入数据

代码语言:javascript
运行
复制
http://example.com, 80
https://lookup/bin/search, 443
testecho345.unix.abc1200.org:8115,80
century.testing.external-abc03:6112,80
century.testing.external-abc03:6112,80
https://century.testing.internal-abc03:6112,443
testecho345.unix.abc1200.org:8115,80
testecho345.unix.abc1200.org:8117,80
  • 如果在URL中显式地声明了端口号,我希望按照:后面的实际端口覆盖第2列中的“默认端口”80。
  • 如果行以http://开头,端口应该是80,如果是https://,端口应该是443。但是,如果明确声明了一个端口,我希望在第2栏中打印该端口。
  • 我还想删除重复行。

期望输出

代码语言:javascript
运行
复制
http://example.com, 80
https://lookup/bin/search, 443
testecho345.unix.abc1200.org,8115
century.testing.external-abc03,6112
https://century.testing.internal-abc03,6112
testecho345.unix.abc1200.org,8117

我尝试使用下面的脚本,但没有得到预期的输出。

代码语言:javascript
运行
复制
    grep -P  '((?<=[^0-9.]|^)[1-9][0-9]{0,2}(\.([0-9]{0,3})){3}(?=[^0-9.]|$)|(http|ftp|https|ftps|sftp)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/+#-]*[\w@?^=%&/+#-])?|\.port|\.host|contact-points|\.uri|\.endpoint)' 4file|sed 's/com.*/com/'|sed 's/org.*/org/'|grep '^[^#]'|sed '/.com\|.org\|10.\|17./!d'|awk '{split($0,a,"#"); print a[1]}'|awk '{split($0,a,"="); print a[1],a[2]}'|awk '{split($0,a,":"); print a[1],a[2]}'|sed -E 's/^([^:]*):([^,]*),.*$/\1,\2/'|sed 's/^\|#/,/g'|awk '/http:\/\//  {print $2,80}
       /https:\/\// {print $2,443}
       /Points/     {print $2,"9042"}
       /host/       {h=$2}
       /port/       {print h,$2; h=""}'|awk -F'[, ]' '{for(i=1;i

谢谢你提前提供帮助。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-05-12 08:15:18

以下内容应该适用于awk

代码语言:javascript
运行
复制
awk -F',' -v OFS=',' '/^http:/ {$2=80} /^https:/ {$2=443} \
$1~/:[0-9]+$/ {n=split($1,f,":"); $2=f[n]; sub(/:[0-9]+$/,"",$1);} !already[$0]++' input.txt

这将将文件解释为以逗号分隔的输入(-F',')和输出(-v OFS=',')。

  • 如果一行以http:开头,则第二列将设置为80
  • 如果一行以https:开头,则第二列将设置为443。
  • 在所有行(包括前面的规则已经处理的行)中,如果第一个字段以:结尾,然后以多个数字结尾,则提取最后一部分,并将其设置为第二列的内容,同时将其从第一列中删除。
  • 每一行的出现计数将记录在数组already中。只有在当前行为0的情况下,才会打印该行的内容。这使用了awk速记法,即出现在规则之外的1 (或实际上是一个数字> 0)意味着“打印到目前为止所做的所有转换”,而0则表示“不打印行”,而后缀++运算符在对逻辑"NOT“进行计算后会增加出现计数。

它应该与GNU awkmawknawk一起工作。

请注意,很少有必要将awksedgrep组合到管道结构中;通常这三种结构中的一种能够单独执行整个任务。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/586078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档