awk:致命:1作为匹配参数的数量无效

时间:2016-01-08 17:25:51

标签: awk

myfile看起来像

Split level: train 67.0%
importance 0.17
Score metric (accuracy_score): 0.986
Score metric (precision_score): 0.903

我想通过awk提取准确度分数(这里是0.986):

$ awk '/Score metric \(accuracy_score\):/ { match(/[0-9]+\.[0-9]+ *$/); substr($0, RSTART, RLENGTH) }' myfile
awk: fatal: 1 is invalid as number of arguments for match

这里的错误是什么意思?我的awk程序中没有1

如何更正程序以使其正常工作?

你有什么更好的解决方案?

2 个答案:

答案 0 :(得分:2)

如果你坚持使用awk,我会这样做:

awk -F':\\s*' '/Score metric \(accuracy_score\)/{print $2}' file

在您的代码中,您在手册页中使用了match()函数:

match(s, r [, a])  s is the string, r is the regex, and optional a is array.

你只给了/..../match()这会被awk解释为布尔值,它会$0~/.../,所以结果是真的。和awk中的boolean.true有int值1

在这里,您找到了1(一个)。

* awk上面我的意思是gnu awk。

答案 1 :(得分:2)

其他人已经说明了匹配参数数量的问题......这可以在 awk 手册中找到。以下答案快速而简单 - 避免使用match()和substr()函数。找到模式后,它会输出最后一个字段。使用LC_ALL = C是因为您的匹配条件和数字都可以用ASCII表示 - 脚本在此模式下运行得更快。

LC_ALL=C awk '/Score metric \(accuracy_score\):/ { print $NF }'