Linux下如何用SED/AWK等命令实现基于Error位的文件位掩码处理?
二进制位掩码处理(Linux命令行实现)
需求说明
在Linux环境中对文件内的二进制位执行掩码处理:当Error行对应位为1时,将Actual行的对应位替换为X;Error位为0时保留Actual原数据。
示例数据
actual : 00-00000000-00000011-00110010-10000000 expect : 00-00000000-00000001-01101010-00000000 error : 00-00000000-00000010-01011000-00000000
预期输出
output : 00-00000000-000000X1-0X1XX010-10000000
当前操作
已通过以下命令提取相关序列到临时文件,但不知如何合并完成最终处理:
grep 'err' gpbat | sed 's?-??g' | cut -c 11-35 | sed 's?1?X?g' > a1 grep 'act' gpbat | sed 's?-??g' | cut -c 11- > a2
解决方案
方法1:AWK一次性处理(无需临时文件)
直接读取原文件gpbat,一步完成提取、掩码处理和格式还原:
awk ' /actual/ { gsub("-", "", $3); act_str = $3 } /error/ { gsub("-", "", $3); err_str = $3 result = "" for(i=1; i<=length(act_str); i++) { result = result (substr(err_str,i,1) == "1" ? "X" : substr(act_str,i,1)) } # 重新插入分隔符,匹配原格式 printf "output : %s-%s-%s-%s-%s\n", substr(result,1,2), substr(result,3,8), substr(result,11,8), substr(result,19,8), substr(result,27,8) } ' gpbat
方法2:合并已生成的临时文件a1、a2
如果已经生成了a1和a2,用AWK逐位合并:
awk ' NR==FNR { err_mask = $0; next } { act_data = $0; output = "" for(i=1; i<=length(act_data); i++) { output = output (substr(err_mask,i,1) == "X" ? "X" : substr(act_data,i,1)) } # 还原分隔格式 printf "output : %s-%s-%s-%s-%s\n", substr(output,1,2), substr(output,3,8), substr(output,11,8), substr(output,19,8), substr(output,27,8) } ' a1 a2
核心逻辑
两种方法都是逐位遍历对比:判断Error位(或a1中的X标记),按规则替换Actual的对应位,最后通过字符串拆分插入连字符,还原成原数据的分隔样式。
内容的提问来源于stack exchange,提问作者John809
相关产品推荐
相关产品推荐

