2015-09-05 115 views
0

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 

但即使这样也不是很大了先进的例子:

我试着用OFMTCONVFMT搞乱,但他们似乎没有任何效果:

$ echo 1000 2000 | awk '{print $2}' OFMT="%'d" CONVFMT="%'d" 
2000 

这些变量可以以我试图使用它们的方式使用,或者是另一种 me可以更好地处理报价问题吗?

+0

我想我可能会用'AWK -f script.awk'去回避问题完全引用。如有必要,我会使用一个here文档,可能带有一个带引号的标记('<<'EOF'')来创建脚本。你甚至可以使用Bash [进程替换](http://www.gnu.org/software/bash/manual/bash.html#Process-Substitution)来避免一个明确命名的临时文件,尽管我不'我认为这样很容易阅读。总是有'精心选择的五种引用'技巧:'awk'BEGIN {printf'%'''''d',1000}''或规范的'awk'BEGIN {printf“%'\''d”, 1000}''。 –

回答

7

要嵌入在一个单引号分隔的命令行脚本一个单引号字符,无论你想报价只用八进制转义序列\047

$ awk 'BEGIN {printf "%\047d\n", 1000}' 
1,000 

积分:不要使用相当于十六进制转义序列\x27

$ awk 'BEGIN{print "\047foo!\047"}' 
'foo!' 
$ awk 'BEGIN{print "\x27foo!\x27"}' 
oo!' 

http://awk.freeshell.org/PrintASingleQuote

+0

你可以做'awk'BEGIN {print'\ x27“”foo \ x27“}'' –

+0

是的,你可以得到你想要的输出,但没有必要记住如何处理'\ x27的警告'而不是使用'\ 047'。 –