暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

awk进制转换(只能十六进制转换为10进制)

刘洪 2022-12-26
1183

awk进制转换(只能十六进制转换为10进制)

# 1 使用 --non-decimal-data + begin + sprintf(); print
# 2 使用 --non-decimal-data + printf

AWK有ASCII字符转换

# ASCII码转换为字符
awk -v d1=65 -v d2=97  'BEGIN{printf "%c %c\n",d1,d2}'    --> A a
awk -v d=$[10#65] 'BEGIN{printf "%c\n",d}'                --> A
echo 65 | awk 'BEGIN{printf "%c\n",$1}'    不使用-v无效无输出
# 字符转换为ASCII码
echo "Aa"|awk -F "" 'BEGIN{for(i=0;i<255;i++)a[sprintf("%c",i)]=i}{print a[$1]" "a[$2]}'  --> 65 97
[解析] 事先建立一个ASCII的映射表, 用sprintf返回其ASCII字符, 然后作为下标赋予该数组的值, 后面的就是正常的查表.

乔纳森答案 乔纳森答案变体 16进制转换为10进制

# $([[ $(awk --version) = GNU* ]] && echo --non-decimal-data)  -->   --non-decimal-data
echo "00 00 01800080" | awk --non-decimal-data 'BEGIN{OFS=FS}{$4=sprintf("%d","0x" $3);print}' --> 00 00 01800080 25165952

echo "00 00 01800080" | awk --non-decimal-data '{printf("%d\n","0x"$3)}'   --> 输出:25165952

echo 0x01800080 | awk '{ printf "%s: %x %d\n", $1, $1,$1 }'      --> 输出: 0x01800080: 0 0
echo 0x01800080 | awk --non-decimal-data '{ printf "%s: %x %d\n", $1, $1,$1 }'   --> 输出: 0x01800080: 1800080 25165952
echo 0x01800080 | gawk '{ printf "%s: %x %d\n", $1, $1,$1 }'      --> 输出: 0x01800080: 0 0
echo 0x01800080 | gawk --non-decimal-data '{ printf "%s: %x %d\n", $1, $1,$1 }'  --> 输出:  0x01800080: 1800080 25165952


echo $[16#01800080] -->  输出25165952
echo 01800080 | awk '{sprintf("%d", "0x" $1)}'  -- 无效
echo 01800080 | awk --non-decimal-data '{printf("%d\n", "0x" $1)}'  输出--> 25165952
echo 01800080 | awk 'BEGIN{sprintf("%d", "0x" $1)}'  -- 无效
echo 01800080 | awk 'BEGIN{OFS = FS}{sprintf("%d", "0x" $1)}'  -- 无效
echo 01800080 | awk --non-decimal-data 'BEGIN{OFS=FS}{sprintf("%d","0x" $1)}'  -- 无效
echo 01800080 | awk --non-decimal-data 'BEGIN{OFS=FS}{print sprintf("%d","0x" $1)}'     --> 输出25165952
echo 01800080 | awk --non-decimal-data 'BEGIN{OFS=FS}{$1=sprintf("%d","0x" $1);print}'  --> 输出25165952

我需要将第3列拆分为3,
123711184642,02,3583090366663629,639f02012437d4 
123711184642,02,3583090366663629,639f02,0124,37d4  --> 我需要将第3列拆分为3,如下所示:
123711184642,02,3583090366663629,639f02,292,14292  --> 并将最后两列中的数字转换为十进制:
 
echo "123711184642,02,3583090366663629,639f02012437d4" | awk $([[ $(awk --version) = GNU* ]] && echo --non-decimal-data) -F, '
    BEGIN {OFS = FS}
    {
        $6 = sprintf("%d", "0x" substr($4, 11, 4))
        $5 = sprintf("%d", "0x" substr($4,  7, 4))
        $4 = substr($4,  1, 6)
        print
    }'

参考:https://qa.1r1g.com/sf/ask/257817731/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论