0

I have a .txt file in which i got 7 columns of hex numbers. Every number is one byte, so every number is written with 2 characters. I Wanted to sum the first six columns (in hex), compare the last 2 characters (in hex) of the result with the 7th column and if it's not the same delete the row. I am using bash in linux so i think i'll need a pipe of commands to do the job. A sample of the data is:

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

the sum of the first six numbers (in hex) is 33b and the "checksum" number is 3b, as the last 2 characters of the sum.

4

1 回答 1

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(它会提示您确认覆盖)。

于 2013-10-08T14:34:52.703 回答