首页 > 解决方案 > 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;

我怎样才能做到这一点?我尝试寻找答案一段时间,但我真的找不到有效的答案。

标签: bashtext

解决方案


您可以使用 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 (",")}


推荐阅读