如何使用awk判断字符串最后3位为字母并输出符合条件的行
awk逐行筛选第一列尾3位为字母的行问题修复
原代码存在的问题
- 执行逻辑块写错:判断和打印逻辑放在了
END{}块中,该块仅会在所有文件行读取完成后执行1次,无法实现逐行校验的需求,最终只会对最后一行的截取结果做单次判断。 - 正则规则不符合要求:使用的正则
/^[A-Za-z]/仅校验字符串的第一个字符为字母,既没有校验3个字符全为字母,也没有做长度兜底判断,第一列长度不足3位时会出现误判。 - 输出逻辑混乱:逐行处理块中直接打印了截取的子串,会输出大量不需要的中间结果,且
str变量会被每一行循环覆盖,到END块中仅保留最后一行的截取值。
正确实现代码
awk -F'|' 'length($1)>=3 && substr($1, length($1)-2, 3) ~ /^[A-Za-z]{3}$/ {print $0}' file
代码逻辑说明
-F'|':指定字段分隔符为|length($1)>=3:前置校验,第一列长度不足3位的行直接跳过,避免截取异常substr($1, length($1)-2, 3):精准截取第一列的最后3个字符,第三个参数指定截取长度为3,避免多取字符/^[A-Za-z]{3}$/:正则匹配截取到的3个字符,从开头到结尾全部为大小写英文字母,无其他字符{print $0}:满足所有判断条件时,打印当前整行内容
注:你提供的测试样例中
aabccde|38731行第一列最后3位为cde,本身符合全字母要求,运行上述代码会正常输出该行,你给出的期望输出中写的aabccxx|38731属于笔误。
内容的提问来源于stack exchange,提问作者Nadia Alice
相关产品推荐
相关产品推荐

