我想在 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}
即,将t
s 替换为其自身,这样当您执行第二个 时它们仍然存在gsub
。 (您也可以使用gsub(key, "&")
替换key
为其自身。)
另一种方法是先修改gsub
实际输入行以外的内容:
{
temp=$0
print gsub("t", "", temp)
b = b + gsub("t", "")
}
END {print b}
答案2
gsub 不只是计算出现的次数,它实际上会替换它们。你在其中的第一个打印语句(大概是用于调试)破坏了它。