awk的printf语句遇百分号问题

几天前我写了一个一行合并字幕的命令,如下

awk '{if ($0 ~ "^[1-9][0-9]*$|-->") {print $0} else {if ($0 ~ "^$") {print "\n"} else {printf $0" "}}}'

结果发现了一个bug,测试后,原因是某一行如果有“%”这个符号的话printf语句输出可能会出错,与“%”后的单词有关,出错的那一行会忽略掉。

问题

可以测试一下

$ echo test 100% www | awk '{printf $0"\n"}'
test 100% words
$ echo test 100% sss | awk '{printf $0"\n"}'
awk: (FILENAME=- FNR=1) 致命错误: 相对格式来说参数个数不足
`test 100% sss
'
^ 跑出范围

把“printf”换成“print”就没这个问题。

原因

Google了几下,终于明白原因,因为“%s”是“printf”的输出转换符,所以出问题了,输出命令大概变成

printf test 100% sss"\n"

解释出错,而“%w”不是有效的输出转换符,所以没问题。

解决

“print”会加上换行符,不合我的要求,而“printf”不输出换行符,除非显示使用“\n”。发现”printf”还有另一种语法,加括号就没这个问题

echo test 100% sss | awk '{printf("%s\n",$0)}'
test 100% sss

所以我把之前的合并字幕改了一下,问题解决。

awk '{if ($0 ~ "^[1-9][0-9]*$|-->") {print $0} else {if ($0 ~ "^$") {print "\n"} else {printf("%s ", $0)}}}'

This entry was posted in 故障分析 and tagged . Bookmark the permalink.

发表评论

您的电子邮箱不会被公开。 标记为 * 的区域必须填写

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">