Awk中kaggr元素含首尾空格导致序列匹配失败的问题
解决awk中元素首尾空格导致匹配失效的问题
问题根源
kaggr数组里的元素带首尾空格时,直接用==和uaggr的元素比对会失败——毕竟" example"和"example"是完全不同的字符串。
两种可行的修复方案
方案1:分割后统一清理空格
分割完pkeys和ukeys后,遍历数组把每个元素的首尾空格去掉,之后再做比对:
match($0, beg_ere, paggr) { pkeys = paggr[4] nuk = split(ukeys, uaggr, ",") npk = split(pkeys, kaggr, ",") # 清理kaggr每个元素的首尾空白 for (j in kaggr) { gsub(/^[[:space:]]+|[[:space:]]+$/, "", kaggr[j]) } # 顺便清理uaggr的元素,防止用户传入的ukeys带空格 for (i in uaggr) { gsub(/^[[:space:]]+|[[:space:]]+$/, "", uaggr[i]) } if (nuk == 0) { display = 1 } else if (nuk > 0 && npk > 0) { umatch = 0 for (i in uaggr) { for (j in kaggr) { if (uaggr[i] == kaggr[j]) { umatch = 1; break } } if (umatch == 1) { display = 1 } } } }
方案2:比对时动态清理空格
不需要提前遍历数组,在判断相等的时候临时处理两个元素的空格:
match($0, beg_ere, paggr) { pkeys = paggr[4] nuk = split(ukeys, uaggr, ",") npk = split(pkeys, kaggr, ",") if (nuk == 0) { display = 1 } else if (nuk > 0 && npk > 0) { umatch = 0 for (i in uaggr) { u_clean = uaggr[i] gsub(/^[[:space:]]+|[[:space:]]+$/, "", u_clean) for (j in kaggr) { k_clean = kaggr[j] gsub(/^[[:space:]]+|[[:space:]]+$/, "", k_clean) if (u_clean == k_clean) { umatch = 1; break } } if (umatch == 1) { display = 1 } } } }
注意点
- 用
[[:space:]]匹配空白字符,比直接写空格更稳妥,能覆盖制表符、换行符等所有空白类型 - 如果用户传入的
ukeys也可能带首尾空格,一定要同步处理uaggr的元素,不然还是会出现匹配失败的情况
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

