【问题标题】:How do i store the output of AWK as a variable to use in a SED command in a BASH script?如何将 AWK 的输出存储为变量以在 BASH 脚本的 SED 命令中使用?
【发布时间】:2013-09-25 15:36:45
【问题描述】:

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

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 的输入。谁能帮忙?谢谢。

【问题讨论】:

  • 对于var 的各种设置,上述 sed 命令会神秘地失败。

标签: bash sed awk pipe stdout


【解决方案1】:

不要那样做,只使用 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 列表中填充变量,除非您需要这样做来更改文件之间的初始值(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那么直观。

【讨论】:

  • 第一个和第二个 awk 语句都完全符合我的要求。谢谢!不过,我现在需要做更多的事情;我想阅读file 的行,并为每一行对他们自己独特的file.xml 执行此操作,它已经存在,它的位置由file 中的$6 给出。这可能吗?
  • 是的,任何文本处理都是可能的。发布一个包含新要求、示例输入和预期输出的新问题。
【解决方案2】:
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 的值替换一些东西

【讨论】:

  • 那不太行.... SED 不再接受该变量,当我有 var=string 之前它没有问题。所以我需要做的是替换这个元素的内容:&lt;remote&gt; https://blabla/bla/bla &lt;/remote&gt; 用“|”分隔的 2 个字段的组合。我是新手,所以尽我所能,由于数据的内容,也不能太详细。谢谢
  • 恕我直言,如果变量需要在文件之间更改,并且如果您要在 awk 参数列表中设置变量,您应该只在 awk arg 列表中设置变量,您至少应该确保您的人'正在回复以了解这样做与使用 -v variable=value 相比的负面影响。
猜你喜欢
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2018-11-06
  • 2021-07-04
  • 1970-01-01
相关资源
最近更新 更多