关于 awk 和整数到 ASCII 字符的转换

Jam*_*own 5 awk gawk

只是为了确定,使用 awk (至少是 Gnu awk)我真的可以转换:

从八进制到 ASCII:

print "\101"         # or a="\101"
A
Run Code Online (Sandbox Code Playgroud)

从十六进制到 ASCII:

print "\x41"         # or b="\x41"
B
Run Code Online (Sandbox Code Playgroud)

但从十进制到 ASCII 我必须:

$ printf "%c\n", 67  # or c=sprintf("%c", 67)
C
Run Code Online (Sandbox Code Playgroud)

print "\?67"我错过的 RTFM(备忘录)中没有秘密吗?

我正在尝试从以下位置获取字符频率$0="aabccc"

for(i=141; i<143; i++) a=a gsub("\\"i, ""); print a
213
Run Code Online (Sandbox Code Playgroud)

但使用十进制(而不是上面示例中的八进制)。十进制方法看起来非常长:

$ cat foo
aabccc
$ awk '{for(i=97;i<=99;i++){c=sprintf("%c",i);a=a gsub(c,"")} print a}' foo
213
Run Code Online (Sandbox Code Playgroud)

就用在这里了。

Ed *_*ton 3

不,\nnn是八进制,\xnn是十六进制 - 这就是包含不能按原样包含在字符串中的字符的全部内容,并且您应该始终使用八进制而不是十六进制表示形式以保持稳健性(例如,请参见http://awk.htm)。 freeshell.org/PrintASingleQuote)。

我不明白你问题的最后一部分,你说明你想用这个做什么 - 提供简洁、可测试的示例输入和预期输出,我相信有人可以帮助你以正确的方式做到这一点,无论如何是。

这就是你想做的吗?

$ awk 'BEGIN{for (i=0141; i<0143; i++) print i}'
97
98
Run Code Online (Sandbox Code Playgroud)