我有一个.txt文件,其中我有7列十六进制数字。每个数字都是一个字节,因此每个数字都写有2个字符。我想要将前六列(十六进制)相加,比较结果与第7列的最后2个字符(十六进制),如果不相同则删除该行。我在linux中使用bash所以我认为我需要一系列命令来完成这项工作。 数据样本为:
de 55 7a ff 41 4e 3b
.. .. .. .. .. .. .. .. .. .. .. ..
前六个数字的总和(十六进制)为33b,“校验和”数为3b,为总和的最后两个字符。
答案 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
(它会提示你确认覆盖)。