【问题标题】:Create a new column in CSV based on contents of another根据另一列的内容在 CSV 中创建一个新列
【发布时间】:2018-08-07 19:40:29
【问题描述】:

我在第 5 个字段中有一个带有 URL 的管道分隔 CSV,我希望使用 awk 命令复制问号字符之前的所有内容并添加一个包含内容的新列。我目前使用的命令是:

cat test.log | awk -F\| -v OFS=\| '{sub(/\?(.*)/,OFS "&", $7); print}' > test2.log

这有几个问题:

  1. 当前命令中的正则表达式用于查找问号之后的所有内容。之前查找所有内容的适当正则表达式是 /[^?]* 但是我在尝试在命令中使用它时遇到语法错误。我对此并不担心,因为我可以通过更多测试来解决它。

  2. 上面的命令创建了一个新列,其中的数据与正则表达式匹配,但是它从列中删除它而不是复制它。

这是我正在寻找的示例:

||||test.com|moredata|
||||test2.com?p1=1|moredata|
||||test3.com?p1=1&p2=2|moredata|

变成:

||||test.com|moredata|test.com
||||test2.com?p1=1|moredata|test2.com
||||test3.com?p1=1&p2=2|moredata|test3.com

是否有一个行为相似但没有替代的函数更适合这个(即匹配?)提前谢谢!

【问题讨论】:

  • 不应该是test2.com?p1=1|test2.com|
  • 确实.. 代码标签有问题并手动键入每一行。谢谢!
  • 发布出现错误的代码。看起来您只是缺少正则表达式末尾的/

标签: bash shell awk scripting


【解决方案1】:

使用split()?字符处分割URL,然后你可以得到它之前的部分并附加它。

awk -F\| -v OFS=\| '{split($5, url, "\?"); $5 = $5 OFS url[1]; print}'

【讨论】:

    【解决方案2】:

    有很多方法可以从您提供的输入中获得您想要的输出,但使用 sub() 似乎是最简单的,所以我知道您为什么要尽量避免它:

    $ awk 'BEGIN{FS=OFS="|"} {$NF=$5; sub(/[?].*/,"",$NF)} 1' file
    ||||test.com|moredata|test.com
    ||||test2.com?p1=1|moredata|test2.com
    ||||test3.com?p1=1&p2=2|moredata|test3.com
    

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 2021-12-02
      • 2020-08-16
      • 1970-01-01
      相关资源
      最近更新 更多