根据另一个内容在CSV中创建一个新列

时间:2018-08-07 19:40:29

标签: bash shell awk scripting

我在第5个字段中有一个用竖线分隔的CSV文件,带有URL,我正在寻找使用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

有没有替代该功能的功能类似的功能(例如-匹配?),请先感谢!

2 个答案:

答案 0 :(得分:0)

使用split()将URL拆分为?字符,然后您可以获取之前的部分并将其附加。

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

答案 1 :(得分:0)

有很多方法可以从提供的输入中获取所需的输出,但是使用sub()似乎是最简单的,所以idk为什么要避免这种情况:

$ 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