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
。
如何更正程序以使其正常工作?
你有什么更好的解决方案?
答案 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 }'