【问题标题】:Concatenate urls based on result of two columns根据两列的结果连接 url
【发布时间】:2021-11-19 20:12:33
【问题描述】:

我想先取出第一列括号中的字符串,我可以这样做:

awk -F"[()]" '{print $2}'

然后,将其与第二列连接以创建具有以下格式的 URL:

"https://ftp.drupal.org/files/projects/"[firstcolumn stripped out of parenthesis]-[secondcolumn].tar.gz

输入如下:

Admin Toolbar (admin_toolbar)           8.x-2.5       
Entity Embed (entity_embed)             8.x-1.2       
Views Reference Field (viewsreference)  8.x-2.0-beta2 
Webform (webform)                       8.x-5.28 

第一行的数据将创建这个 URL:

https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.5.tar.gz

【问题讨论】:

  • 请阅读stackoverflow.com/help/formatting,然后阅读edit 您的问题,以修正示例输入、输出和代码的格式。您加入该论坛已有 10 多年了,现在该学习如何使用它了。
  • 感谢 Ed 的建议。
  • 不客气,我敢肯定,只要您格式化您的问题,您就会得到一些好的答案。如果您不确定该怎么做,请查看其他已投票并回答的问题示例。

标签: regex awk sed


【解决方案1】:

类似

sed 's!^[^(]*(\([^)]*\))[[:space:]]*\(.*\)!https://ftp.drupal.org/files/projects/\1-\2.tar.gz!' input.txt

【讨论】:

  • 也许添加如下评论:你想要's/.*(\(.*\)) *(.*)/url\1-\2.tar.tgz/' 之类的东西。完成这项工作需要进行一些更改,从而导致 ...
【解决方案2】:

如果文件a 有你的输入,你可以试试这个:

$ awk -F'[()]' '
  { 
    split($3,parts," *") 
    printf "https://ftp.drupal.org/files/projects/%s-%s.tar.gz\n", $2, parts[2]
  }' a 
https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.5.tar.gz
https://ftp.drupal.org/files/projects/entity_embed-8.x-1.2.tar.gz
https://ftp.drupal.org/files/projects/viewsreference-8.x-2.0-beta2.tar.gz
https://ftp.drupal.org/files/projects/webform-8.x-5.28.tar.gz

诀窍是拆分第三个字段 ($3)。根据您的字段分隔符 (-F'[()]'),第三个字段包含右括号之后的所有内容。因此,可以使用 split 来消除所有空格。我可能应该搜索 awk “trim” 等价物。

【讨论】:

    【解决方案3】:

    在示例数据中,倒数第二列似乎包含您感兴趣的带括号的部分,以及最后一列的值。

    如果总是这样,您可以删除倒数第二列的括号,然后连接连字符和最后一列。

    awk '{
    gsub(/[()]/, "", $(NF-1))
    printf "https://ftp.drupal.org/files/projects/%s-%s.tar.gz%s", $(NF-1), $NF, ORS
    }' file
    

    输出

    https://ftp.drupal.org/files/projects/admin_toolbar-8.x-2.5.tar.gz
    https://ftp.drupal.org/files/projects/entity_embed-8.x-1.2.tar.gz
    https://ftp.drupal.org/files/projects/viewsreference-8.x-2.0-beta2.tar.gz
    https://ftp.drupal.org/files/projects/webform-8.x-5.28.tar.gz
    

    另一个带有正则表达式和 gnu awk 的选项,使用 match 和 2 个捕获组来捕获括号和下一个字段之间的内容。

    awk 'match($0, /^[^()]*\(([^()]+)\)\s+(\S+)/, ary) {
    printf "https://ftp.drupal.org/files/projects/%s-%s.tar.gz%s", ary[1], ary[2], ORS
    }' file
    

    【讨论】:

    • 谢谢,如果我的输出不在文件中,它在标准输出上,我可以通过管道传输这个命令吗?还是将输出保存在文件中然后运行 ​​awk 命令更好?
    • @tleo 您可以将输出通过管道传输到 awk,请参阅 ideone.com/iK2nmN
    【解决方案4】:

    这可能对你有用(GNU sed):

    sed 's#.*(#https://ftp.drupal.org/files/projects/#;s/)\s*/-/;s/\s*$/.tar.gz/' file
    

    模式匹配,用所需的字符串替换不需要的部分。

    注意使用# 作为替换命令的分隔符以避免在文字替换中插入反斜杠。

    上述解决方案可改进为:

    sed -E 's#.*\((.*)\)\s*(\S*).*#https://ftp.drupal.org/files/projects/\1-\2.tar.gz#' file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 2016-05-02
      • 2021-01-14
      • 2011-09-19
      相关资源
      最近更新 更多