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

关于awk和整数到ASCII字符的转换,awk,gawk,Awk,Gawk,为了确保,使用awk(至少Gnu awk)我真的可以转换: 通过以下方式从八进制到ASCII: print "\101" # or a="\101" A 从十六进制到ASCII: print "\x41" # or b="\x41" B 但从十进制到ASCII,我必须: $ printf "%c\n", 67 # or c=sprintf("%c", 67) C 在我错过的RTFM(备忘录)中没有秘密打印“\?67” 我试图从$0=“aabccc”中获取字

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

通过以下方式从八进制到ASCII:

print "\101"         # or a="\101"
A
从十六进制到ASCII:

print "\x41"         # or b="\x41"
B
但从十进制到ASCII,我必须:

$ printf "%c\n", 67  # or c=sprintf("%c", 67)
C
在我错过的RTFM(备忘录)中没有秘密
打印“\?67”

我试图从
$0=“aabccc”
中获取字符频率,例如:

for(i=141; i<143; i++) a=a gsub("\\"i, ""); print a
213

for(i=141;iNo,
\nnn
是八进制,
\xnn
是十六进制-这就是包含不能按原样包含在字符串中的字符的所有方法,为了保证健壮性,您应该始终使用八进制而不是十六进制表示法(例如,请参阅)

我不理解你问题的最后一部分,你陈述了你想用这个做什么——提供简洁、可测试的样本输入和预期输出,我相信有人可以帮助你以正确的方式来做,不管是什么

这就是你想做的吗

$ awk 'BEGIN{for (i=0141; i<0143; i++) print i}'
97
98

$awk'BEGIN{for(i=0141;i查找表是在“awk only”中解决此问题(直接将字符转换为ASCII十进制)的唯一方法

您可以简单地使用sprintf()将ASCII十进制转换为字符

  • 您可以通过遍历每个已知的 ascii字符并将其存储在一个数组中,其中键是字符,值是该字符的ascii值

  • 您可以在AWK中使用sprintf()来获取每个十进制数的字符

  • 然后,您可以将字符传递给数组以获得相应的 又是十进制

在本例中,使用awk

  • 我们循环使用所有256个字符,打印出每个字符
  • 我们将结果字符串拆分为一系列行,其中每行都有一个字符
  • 我们在awk中构建一个256个字符的表(在BEGIN中),然后输入每个输入字符以查找每个字符
  • 最后,我们打印出输入中每个字符的代码
awk'开始{

对于(n=0;n如果正如你在问题末尾所说的,你只是想计算字符的频率,那么我就组装一个数组

$ awk '{for(i=1;i<=length($0);i++) a[substr($0,i,1)]++} END{for(i in a) printf "%d %s\n",a[i],i}' <<<$'aabccc\ndaae'
1 d
1 e
4 a
1 b
3 c

$awk'{for(i=1;i注意:第二个示例可能会打印出大量高ascii范围(>128)的垃圾,具体取决于您使用的字符集

对于128-255,可以使用八进制代码\200-\377来避免这种情况


IIRC字节C0 C1 F5 F6 F7 F8 F9 FA FB FC FD FE FF不应存在于正确编码的UTF-8文档中(或尚未指定).FE和FF可能与UTF16字节顺序标记重叠,但这在今天几乎不应该成为一个问题,因为世界已经对UTF-8进行了标准化。

显然,我也不能让
for运行八进制,
~for(I=\141;iOctal数字以
0
开头,而不是反斜杠或
1
。试试
awk'BEGIN{print 0141}“
->
97
。您似乎把字符串中ascii字符的表示形式与数字混淆了。如果您用您试图做的事情(包括示例输入/输出)更新您的问题,我相信您会得到帮助。您是对的,我一直在
print”\141”
->
a
太多了。谢谢。好了,我现在知道你在做什么了,你问题中的最后一个脚本是你最好的选择,如果你想让它稍微简短一点的话,
a=a gsub(sprintf(“%c”,I),”)
awk 'BEGIN{
    for(n=0;n<256;n++)
        print sprintf("%c",n)
}' | awk '{
for (i=0; ++i <= length($0);)
    printf "%s\n", substr($0, i, 1)
}' | awk 'BEGIN{
    for(n=0;n<256;n++)
        ord[sprintf("%c",n)]=n
}{
    print ord[$1]
}'
awk 'BEGIN{
    for(n=0;n<256;n++)
        print sprintf("%s",n)
}' | awk 'BEGIN{
    for(n=0;n<256;n++)
        char[n]=sprintf("%c",n)
}{
    print char[$1]
}'
$ awk '{for(i=1;i<=length($0);i++) a[substr($0,i,1)]++} END{for(i in a) printf "%d %s\n",a[i],i}' <<<$'aabccc\ndaae'
1 d
1 e
4 a
1 b
3 c