首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Sed、Awk等将第一列中的每一行数据复制到最后一列中的html超链接中。

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

Stack Overflow用户
提问于 2022-08-29 01:51:55
回答 5查看 118关注 0票数 2

我要做的是从第一列中的每一行复制第一次数据,并将其放到创建的最后一列的超链接中

这是我每天得到的文件的一个例子。让我们调用这个文件input.csv,我想将它转换为output.csv

每天的行数各不相同。

INPUT.CSV

代码语言:javascript
运行
复制
number|name|age|gender
B24|mike|22|male
B65|john|45|male
B74|jane|29|female

这就是我想要的样子:

OUTPUT.CSV

代码语言:javascript
运行
复制
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>

为了使它更整洁,我把一些变量放在了适当的位置。

test.sh

代码语言:javascript
运行
复制
#!/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

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

失败结果

代码语言:javascript
运行
复制
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>

感谢你的帮助!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-08-29 01:57:37

第一种解决方案:和您的示例一起使用,请尝试遵循awk代码。用GNU awk编写和测试。

代码语言:javascript
运行
复制
awk '
BEGIN { FS=OFS="|" }
FNR==1{
  print $0,"website"
  next
}
{
  print $0,"<a href=https://www.abcdef.com/query="$1">"$1"</a>"
}
'  Input_file

第二解决方案在此基础上又增加了1种awk代码变体,其中设置了具有<a href=https://www.abcdef.com/query=值的变量firstHeader,以备将来需要修改时,不必更改主程序。

代码语言:javascript
运行
复制
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

在上述版本中,使用三元操作符条件很少调整:

代码语言:javascript
运行
复制
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
票数 6
EN

Stack Overflow用户

发布于 2022-08-29 02:28:21

这个sed应该适用于您:

代码语言:javascript
运行
复制
sed -E '1s/$/|website/; 1!s~^([^|]+).*~&|<a href=https://www.abcdef.com/query=\1>\1</a>~' file

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>
票数 4
EN

Stack Overflow用户

发布于 2022-08-29 08:02:23

我将利用GNU AWK来完成以下任务,让file.txt内容成为

代码语言:javascript
运行
复制
number|name|age|gender
B24|mike|22|male
B65|john|45|male
B74|jane|29|female

然后

代码语言:javascript
运行
复制
awk 'BEGIN{FS=OFS="|"}NR==1{print $0,"website";next}{printf "%s|<a href=https://www.abcdef.com/query=%s>%s</a>\n", $0, $1, $1}' file.txt

给予输出

代码语言:javascript
运行
复制
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>

说明:我通知GNU AWK,管道字符(|)既是字段分隔符(FS),也是输出字段分隔符(OFS)。对于第一行,我打印行(后面是website ),对于所有其他行,我使用printf与字符串一起填充,三个位置由%s表示:第一个用于已存在字段,第二个用于查询值,第三个用于a标记文本,使用整个使用行as原样($0)和第一个字段($1)和第一个字段($1)填充。请注意,我的换行符(\n)在末尾,因为printf没有提供它。

(在gawk 4.2.1中测试)

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

https://stackoverflow.com/questions/73523467

复制
相关文章

相似问题

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