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可以打印带有千位分隔符的数字:

$ 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
的警告。