如何将AWK的输出存储为变量以在BASH脚本中的SED命令中使用?

时间:2013-09-25 15:36:45

标签: bash sed awk pipe stdout

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

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的输入。有人可以帮忙吗?感谢。

2 个答案:

答案 0 :(得分: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

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

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

$ 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做什么,这一切都是可以理解和可预测的,但我敢打赌,对于一个新人来说这是非常令人费解,所以抄本列表中的恕我直言填充变量不应该是我们建议人们默认初始化他们的变量的方式。它的语义远不如-v variable=value

答案 1 :(得分: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

的内容