如何实现十六进制差值为20时合并对应行数据并输出?
实现十六进制差值匹配与文本拼接需求
需求说明
现有文件abc.txt,每行包含两列数据:第一列为十六进制地址,第二列为空格分隔的字符串。需要实现以下逻辑:
- 若后一行第一列的十六进制地址与前一行的差值为
0x20 - 将后一行第二列的所有空格去除,拼接上前一行第二列去除空格后的字符串
- 最终将前一行的十六进制地址与拼接后的字符串组成新行,写入结果文件
输入文件示例:
000000008b8c5200 af dg sd jh g1 43 66 23 67 000000008b8c5220 bc bi ub cb ue qi hd 16 72 0000000056fb2620 ad ag sj ha bn bc bh 53 69 0000000056fb2640 ak bh jg bf re 34 16 8g ff 0000000045ab4630 sg fj g3 6g dh w7 28 g7 dg 0000000045ab4650 jb sh jd b7 us vy ys du 89
预期输出格式:
000000008b8c5200 bcbiubcbueqihd1672afdgsdjhg143662367 0000000056fb2620 akbhjgbfre34168gffadagsjhabnbcbh5369 0000000045ab4630 jbshjdb7usvyysdu89sgfjg36gdhw728g7dg
解决方案:使用AWK脚本实现
AWK适合处理文本行的字段提取与数值计算,以下是实现脚本:
# 定义去除空格的函数 function trim_space(str) { gsub(/ /, "", str) return str } # 从第二行开始处理,与前一行数据比较 NR > 1 { # 将十六进制地址字符串转为数值 prev_addr = strtonum("0x" prev_col1) curr_addr = strtonum("0x" $1) # 判断地址差值是否为0x20 if (curr_addr - prev_addr == 0x20) { # 去除两行第二列内容的空格并拼接 trimmed_curr = trim_space(curr_col2) trimmed_prev = trim_space(prev_col2) # 输出结果行 printf "%s %s%s\n", prev_col1, trimmed_curr, trimmed_prev } } # 保存当前行的关键数据,供下一行比较使用 { prev_col1 = $1 # 提取第二列及之后的所有内容(保留原始空格,后续统一去除) prev_col2 = substr($0, index($0, $2)) }
运行方式
- 将上述脚本保存为
process.awk文件 - 在终端执行命令:
awk -f process.awk abc.txt > result.txt
执行完成后,result.txt文件即为符合要求的输出结果。
脚本说明
trim_space函数:通过gsub全局替换字符串中的所有空格,实现去空格效果strtonum("0x" xxx):将十六进制格式的地址字符串转换为十进制数值,方便进行差值计算substr($0, index($0, $2)):准确提取每行第二列及之后的所有内容,避免因第一列后的空格数量不一致导致的字段提取错误- 仅当地址差值符合要求时才输出结果行,确保只保留符合条件的拼接数据
内容的提问来源于stack exchange,提问作者V_S
相关产品推荐
相关产品推荐

