实际上,我在Gnuplot中遇到了这个问题。但是以一种简单的方式,问题是我想使用sprintf以字符串格式打印,即使字符串由数字和符号组成。像这样:
a = '12/7'
sprintf('%.f', a)
Run Code Online (Sandbox Code Playgroud)
我可以在Gnuplot中运行它,但是它只显示符号“ /”之前的数字。我希望输出应打印出变量a'12 / 7'的所有内容。对这种情况有什么建议吗?
如果您指的是 中的sprintf内置函数gnuplot,文档help sprintf说:
sprintf("format",var1,var2,...)将标准 C 语言格式说明符应用于多个参数并返回结果字符串。如果要使用 gnuplot 自己的格式说明符,则必须改为调用gprintf(). 有关 sprintf 格式说明符的信息,请参阅标准 C 语言文档或 unix sprintf 手册页。
在 Unix 手册页中%f说(被截断):
%f, %F -- double 参数被四舍五入并转换为 [-]ddd.ddd 样式中的十进制表示法,其中小数点字符后的位数等于精度规范。
因此,您需要使用不同的格式说明符。正如 fedorqui 指出的那样,适当的格式说明符是%s.
我经常参考此链接中的表格来查找适当的格式说明符(我发现 C 手册页有点长)。
sprintf与文件中的字符串一起使用
为了用于sprintf从文件中格式化字符串,您需要指定文件中要从中提取字符串信息的列。这需要使用stringcolumn命令来完成,而不仅仅是使用$符号。
例如,如果您想从文件中包含一个数字,您可以使用如下命令:
plot "data.dat" using 1:2:(sprintf('%f', $3)) with labels
Run Code Online (Sandbox Code Playgroud)
但是对于字符串,您需要:
plot "data.dat" using 1:2:(sprintf('%s', stringcolumn(3))) with labels
Run Code Online (Sandbox Code Playgroud)
当你说
$ awk 'BEGIN {a="12/7"; printf "%.f", a}'
12
Run Code Online (Sandbox Code Playgroud)
您可以获得数字的 int 部分,因为通过在printff中使用标志,您可以将其转换为数字而不是字符串。所以这相当于说:
awk 'BEGIN {a="12/7"; a=int(a); print a}'
Run Code Online (Sandbox Code Playgroud)
如果您想保留所有内容,请使用%sfor string:
$ awk 'BEGIN {printf "%s", "234-456"}'
234-456
Run Code Online (Sandbox Code Playgroud)