1

我用它来创建一个字符串:

awk -F "|" 'NR==1 {print $2$4}' file

我现在想使用这个字符串来使用 SED 替换另一个字符串,使用这个代码,我知道这是有效的:

sed -i.bak 's/\(<remote>\).*\(<\/remote>\)/<remote> http:\/\/blabla\/'$var' <\/remote>/g' file2.xml

但我不知道如何将 awk 的输出保存为 $var 首先用作 SED 的输入。谁能帮忙?谢谢。

4

2 回答 2

2

不要那样做,只需使用 awk,例如:

awk -F'|' '
NR==FNR { if (NR==1) var = $2$4; next }
{ gsub(/<remote>.*<\/remote>/,"<remote> http://blabla/" var " </remote>"); print }
' file file2.xml > tmp && mv tmp file2.xml

使用 GNU awk 您可以提高效率,但除非您的第一个文件很大,否则不会产生明显的影响:

awk -F'|' '
NR==FNR { var = $2$4; nextfile }
{ gsub(/<remote>.*<\/remote>/,"<remote> http://blabla/" var " </remote>"); print }
' file file2.xml > tmp && mv tmp file2.xml

wrt我在别人的帖子中发表的评论,这就是为什么你应该我们-v var=val而不是在 awk args 列表中填充变量,除非你需要这样做来更改文件之间的初始值(对于 BEGINFILE 提供的 GNU awk 来说不是必需的):

这是一个脚本,用于将存储在 3 个文件中的值添加到某个初始种子值,并打印每个文件和所有文件的结果(种子只添加到总数中一次)。文件 2 为空:

$ cat file1
3
6
$ cat file2
$ cat file3
2
5
$ cat tst.awk                                
BEGIN {
    print "seed value =", seed

    for (i=1; i<ARGC; i++)
        subtotal[ARGV[i]] = seed

    total = seed
}

{
    subtotal[FILENAME] += $0
    total += $0
}

END {
    for (filename in subtotal)
        print "File", filename, "subtotal =", subtotal[filename]

    print "total =", total
}
$ 
$ awk -v seed=7 -f tst.awk file1 file2 file3
seed value = 7
File file1 subtotal = 16
File file2 subtotal = 7
File file3 subtotal = 14
total = 23

一切都说得通吧?现在让我们将“种子”的设置移动到参数列表中:

$ awk -f tst.awk seed=7 file1 file2 file3          
seed value = 
File file1 subtotal = 9
File file2 subtotal = 
File file3 subtotal = 7
File seed=7 subtotal = 
total = 16

请注意,第一次打印中缺少种子值,小计和总计是错误的,并且有一个输出试图打印名为“seed=7”的文件的值。

一旦你确切地知道你在用 awk 做什么,这一切都是可以解释和可预测的,但我敢打赌,这对新手来说非常莫名其妙,所以恕我直言,在 arg 列表中填充变量不应该是我们建议人们默认初始化变量的方式,因为它已经很远了不如 直观的语义-v variable=value

于 2013-09-25T16:21:37.743 回答
1
var=$(awk -F "|" 'NR==1 {print $2$4}' file)

但是最好你给我们数据和如何处理它。通过这种方式,我们可以制作一个 awk 或 sed 来完成这一切。

编辑:

var="test"
echo "https://blabla/bla/bla </remote>" | awk '{$NF="</"v">"}1' v="$var"
https://blabla/bla/bla </test>

这将用 $var 的值替换一些东西

于 2013-09-25T15:39:11.350 回答