Awk 用千位分隔符报价
awk可以打印带有千位分隔符的数字:Awk 用千位分隔符报价,awk,printf,quoting,Awk,Printf,Quoting,awk可以打印带有千位分隔符的数字: $ awk "BEGIN {printf \"%'d\", 1000}" 1,000 然而,事实上,它需要一个单一的报价意味着你必须逃避 整个脚本中的每个“和$: $ echo 1000 2000 | awk "{printf \"%'d\", \$2}" 2,000 这在这里很容易,但在大型示例中可能会很麻烦 做这样的事情: $ echo 1000 2000 | awk '{printf z, $2}' z="%'d" 2,000 但即使这样,对于高
$ awk "BEGIN {printf \"%'d\", 1000}"
1,000
然而,事实上,它需要一个单一的报价意味着你必须逃避
整个脚本中的每个“
和$
:
$ echo 1000 2000 | awk "{printf \"%'d\", \$2}"
2,000
这在这里很容易,但在大型示例中可能会很麻烦
做这样的事情:
$ echo 1000 2000 | awk '{printf z, $2}' z="%'d"
2,000
但即使这样,对于高级示例来说也不是很好:
$ echo 1000 2000 | awk '{printf "hello " z " world " z, $1, $2}' z="%'d"
hello 1,000 world 2,000
我试着弄乱了OFMT的和CONVFMT
,但它们似乎没有效果:
$ echo 1000 2000 | awk '{print $2}' OFMT="%'d" CONVFMT="%'d"
2000
这些变量能以我试图使用它们的方式使用吗,或者是另一种方式
方法可以更好地处理引号问题?要在单引号分隔的命令行脚本中嵌入单引号字符,只需在需要引号的地方使用八进制转义序列\047
:
$ awk 'BEGIN {printf "%\047d\n", 1000}'
1,000
额外积分:不要使用等效的十六进制转义序列\x27
:
$ awk 'BEGIN{print "\047foo!\047"}'
'foo!'
$ awk 'BEGIN{print "\x27foo!\x27"}'
oo!'
请参见此版本将打印
每当找到%d
时,使用分隔符:
awk '
func t(u) {
return gensub("%d", "%\047d", "g", u)
}
{
printf t("hello %d world %d"), $1, $2
}
'
我想我可能会使用awk-f script.awk
来避免引号的问题。如果有必要,我会使用一个带有引号的here文档(你可以这样做awk'BEGIN{print'\x27''foo\x27}“
是的,你可以得到你想要的输出,但是没有必要记住如何处理\x27
与仅使用\047
的警告。