AWK - 将变量和函数结果添加到变量

AWK - 将变量和函数结果添加到变量

我想在 AWK 中添加变量和函数结果。输入:

t t t t
a t a ta
ata ta a a

脚本:

{
key="t"
print gsub(key,"")#<-it's work
b=b+gsub(key,"")#<- it's something wrong
}
END{
print b}#<-so this is 0

输出:

4
2
2
0#<-the last print

答案1

您的代码存在以下问题:Brandon Xavier 指出,这gsub不仅仅是数数匹配;它实际上会替换它们。例如,

{
    print
    print gsub("t", "")
    print
    print gsub("t", "")
    print
    print "----------"
}

将打印

t t t t
4

0

----------
a t a ta
2
a  a a
0
a  a a
----------
ata ta a a
2
aa a a a
0
aa a a a
----------

如果你不介意破坏你的输入数据(即,如果计算 st仅有的如果你想用它们来做某件事(或者你想用它们来做什么),你可以使用 Brandon 的建议:

{
    x = gsub("t", "")
    print x
    b=b+x
}
END {print b}

上述方法可以说是最好的答案,因为它消除了您的冗余gsub调用。 (以下方法仍然使用两次调用gsub。)

如果您想避免添加新变量,您可以通过使替换非破坏性来实现:

{
    key="t"
    print gsub(key, key)
    b=b+gsub(key, key)
}
END {print b}

即,将ts 替换为其自身,这样当您执行第二个 时它们仍然存在gsub。 (您也可以使用gsub(key, "&")替换key为其自身。)

另一种方法是先修改gsub 实际输入行以外的内容:

{
    temp=$0
    print gsub("t", "", temp)
    b = b + gsub("t", "")
}
END {print b}

答案2

gsub 不只是计算出现的次数,它实际上会替换它们。你在其中的第一个打印语句(大概是用于调试)破坏了它。

相关内容