校验和的十六进制数字串

时间:2013-10-08 14:02:45

标签: bash sum hex

我有一个.txt文件,其中我有7列十六进制数字。每个数字都是一个字节,因此每个数字都写有2个字符。我想要将前六列(十六进制)相加,比较结果与第7列的最后2个字符(十六进制),如果不相同则删除该行。我在linux中使用bash所以我认为我需要一系列命令来完成这项工作。 数据样本为:

de 55 7a ff 41 4e 3b
.. .. .. .. .. .. .. .. .. .. .. ..

前六个数字的总和(十六进制)为33b,“校验和”数为3b,为总和的最后两个字符。

1 个答案:

答案 0 :(得分:1)

您可以使用单个awk命令进行整个比较/检查,但它可能不是很漂亮。

棘手的部分是获取你拥有的数字,例如de,并告诉awk它是十六进制而不是字符串/小数。我们可以使用0x作为前缀,然后使用strtonum()

来完成此操作

在我们将数字转换为“可用数字”之后,我们可以执行添加前6列的数学运算,然后获取结果的子字符串(最后两个字符)并将其与第7列进行比较。如果他们是平等的,打印那条线;如果没有,请忽略它:

awk '{
    x = sprintf("%x",
            strtonum("0x"$1)
            + strtonum("0x"$2)
            + strtonum("0x"$3)
            + strtonum("0x"$4)
            + strtonum("0x"$5)
            + strtonum("0x"$6)
     );

     if (substr(x, length(x) -1, length(x)) == $7) {
         print $0
     };
}' input.txt

(注意:您可能必须将sprintf()内容放在单行上才能使其正确执行;为了便于阅读,我将其扩展到此处

要将此输出到文件,您可以将> output.txt附加到上述命令的末尾,它只包含与未有效“删除”的所有行匹配的行。

如果你想要覆盖原件,除非你绝对不需要,否则我会推荐它,你可以追加> output.txt && mv output.txt input.txt(它会提示你确认覆盖)。