使用 Sed、Awk 等将第一列中每一行的数据复制到最后一列中的 html 超链接中

igb*_*s09 2 csv awk sed

我想做的是复制第一列中每一行的第一个数据并将其放入创建的最后一列中的超链接中

这是我每天收到的文件的示例。我们将此文件称为input.csv,我想将其转换为output.csv

PS 行数每天都不同。

输入.CSV

number|name|age|gender
B24|mike|22|male
B65|john|45|male
B74|jane|29|female
Run Code Online (Sandbox Code Playgroud)

这就是我想要的样子:

输出.CSV

number|name|age|gender|website
B24|mike|22|male|<a href=https://www.abcdef.com/query=B24>B24</a>
B65|john|45|male|<a href=https://www.abcdef.com/query=B65>B65</a>
B74|jane|29|female|<a href=https://www.abcdef.com/query=B74>B74</a>
Run Code Online (Sandbox Code Playgroud)

为了使它更整洁,我放置了一些变量

测试文件

#!/bin/bash

NUMBER=(data from the "number" column of each corresponding row in the input.csv file)
URL=https://www.abcdef.com/search?query=$NUMBER

awk -F"|" 'BEGIN { OFS = "|" } {$5="<a href='$URL'>'$NUMBER'</a>"; print}' input.csv > output.csv
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经能够做到这一点,只需创建一个新列并在整个列中重复超链接,失败输出的结果如下:

结果失败

number|name|age|gender|<a href=https://www.abcdef.com/search?query=></a>
B65|john|45|male|<a href=https://www.abcdef.com/query=B65>B65</a>
B74|jane|29|female|<a href=https://www.abcdef.com/query=B74>B74</a>
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

Rav*_*h13 6

第一个解决方案:根据您显示的示例,请尝试以下awk代码。用 GNU 编写和测试awk

awk '
BEGIN { FS=OFS="|" }
FNR==1{
  print $0,"website"
  next
}
{
  print $0,"<a href=https://www.abcdef.com/query="$1">"$1"</a>"
}
'  Input_file
Run Code Online (Sandbox Code Playgroud)

第二个解决方案在上面添加了 1 个以上的代码变体awk,其中将变量命名firstHeader为具有值,<a href=https://www.abcdef.com/query=以防万一我们将来需要更改它,然后我们不需要更改主程序。

awk -v firstHeader="<a href=https://www.abcdef.com/query=" -v secheader="</a>" '
BEGIN { FS=OFS="|" }
FNR==1{
  print $0,"website"
  next
}
{
  print $0,firstHeader $1">"$1 secheader
}
'  Input_file
Run Code Online (Sandbox Code Playgroud)

或者在上面的版本中使用三元运算符条件进行一些调整:

awk -v firstHeader="<a href=https://www.abcdef.com/query=" -v secheader="</a>" '
BEGIN { FS=OFS="|" }
{
  print $0, (FNR==1 ? "website" : firstHeader $1">"$1 secheader)
}
'  Input_file
Run Code Online (Sandbox Code Playgroud)