如何使用awk匹配第1列开头2字符与第2列第5、6位字符
匹配列指定位置字符的awk实现方案
原代码问题说明
你写的脚本存在3个核心问题:
- 语法不规范:判断
$2!=""和后续赋值语句没有分隔,awk无法正确识别逻辑分支 - 截取逻辑错误:你需要的是第2列固定位置的第5、6位字符,不需要通过长度倒推位置,且substr参数使用错误
- 正则匹配逻辑错误:
/^str/是匹配字面量字符串"str",无法匹配你定义的str变量内容
正确实现代码
因为你备注第2列BIC码长度固定为11位,直接按固定位置截取即可,不需要动态计算长度,代码如下:
awk 'BEGIN{FS=OFS="|"} $2 != "" { prefix1 = substr($1, 1, 2) bic_part = substr($2, 5, 2) if (prefix1 == bic_part) print }' file
逻辑说明
BEGIN{FS=OFS="|"}:设置输入、输出字段分隔符均为|,保证输出格式和输入一致$2 != "":提前过滤第2列为空的无效行,减少不必要的计算substr($1, 1, 2):从第1列第1位开始截取2个字符,拿到第1列开头的2个字符substr($2, 5, 2):从第2列第5位开始截取2个字符,正好拿到BIC码的第5、6位- 两个截取结果相等时打印整行,即可得到匹配的记录
运行结果
传入你提供的测试文件,执行后输出和期望完全一致:
CZ987876654534|HDFCCZPXXXX|Czech Republic|1243765 LU987876986576|BSUILUPXXXX|Australia|8765
补充说明:如果后续需要用awk正则匹配变量内容,不能直接把变量写在
//正则常量里,需要写成$1 ~ "^" str的形式,不过当前场景直接做字符串相等判断,比正则匹配效率更高,也不会出现特殊字符转义问题。
内容的提问来源于stack exchange,提问作者Nadia Alice
相关产品推荐
相关产品推荐

