bash - Bash 命令将不同的字段从十六进制转换为十进制
问题描述
我有一个带有以下示例行的文本文件:
40,1,1a,0002,0001,,1234;5678;,027e;0280;
50,1,1a,0001,0004,,,0890;
我想将用逗号或分号分隔的项目从十六进制转换为十进制,但仅适用于第二个字段右侧的字段。左边的第一个和第二个字段已经是十进制的。字段数不同。
我想在 bash 中编写一个命令来将上面的文件转换为下面的文件:
40,1,26,2,1,,4660;22136;,638;640;
50,1,26,1,4,,,2192;
我怎样才能做到这一点?我尝试寻找答案一段时间,但我真的找不到有效的答案。
解决方案
您可以使用 awk 执行此操作。棘手的部分是使用逗号和分号进行拆分。最简单的方法是先用逗号分割,然后检查结果子串中是否有分号
echo "40,1,1a,0002,0001,,1234;5678;,027e;0280;" | awk --non-decimal-data -F, '
{printf ("%s,%s,",$1,$2)};
{ for(i = 3; i <= NF; i++) {
n = split($i,tmp,";")
{ for(j = 1; j <= (n-1); j++)
if (length(tmp[j]) != 0) {printf ("%d;","0x"tmp[j])}
}
if (length(tmp[j]) != 0) {printf ("%d","0x"tmp[n])}
if (i != NF) {printf (",")}
}
{printf ("\n")}
}'
40,1,26,2,1,,4660;22136;,638;640;
表示这些值不是十进制的--non-decimal-data
用逗号分隔字段-F,
打印前 2 个值
{printf ("%s,%s,",$1,$2)};
从逗号之间的第三个字段开始遍历子字符串:
for(i = 3; i <= NF; i++)
使用分号字段拆分子字符串,并将数组存储在 tmp 数组中:
n = split($i,tmp,";")
遍历子字符串并将十六进制转换为十进制。如果缺少值,则不打印任何内容(否则打印 0)
{ for(j = 1; j <= (n-1); j++)
if (length(tmp[j]) != 0) {printf ("%d;","0x"tmp[j])}
}
打印不带分号的最后一个值
if (length(tmp[j]) != 0) {printf ("%d","0x"tmp[n])}
如果这不是最后一个字段,请添加逗号作为分隔符:
if (i != NF) {printf (",")}
推荐阅读
- php - 仅在某些行上替换 PHP 字符串
- spring-cloud-stream - 如何从配置中定义的 spring.rabbitmq.addresses 服务连接到 2 个不同的 rabbitmq 集群
- flutter - 在 Flutter 中预缓存 html 页面
- spring - 用于前端 + 守护程序应用程序的 Azure B2C
- php - PHP - 显示不同时区的数据
- datetime - 如何在 jmeter 中为单个 https 请求设置不同的时隙
- python - 系统显示已安装所有请求的软件包。但是我在导入 pytorch 时收到错误消息
- batch-file - 我用于安装程序的批处理文件崩溃了
- c# - 具有 Async/Await 的通用 Windows UI 响应性
- javascript - AudioBuffer.copyFromChannel 返回空的 Float32Array