如何用Awk组合多条件匹配:跳过首尾行、长度与字符校验
当然可以整合!这里是合并后的Awk脚本及详解
完全没问题,咱们可以把所有验证条件打包到一个Awk命令里,既简洁又高效。我给你两种实现思路,你可以根据需求选择:
方法1:利用缓冲区自动跳过首尾行(无需预先统计行数)
这个思路延续了你原来跳过首尾行的逻辑,通过变量缓存前一行内容,同时加入长度和字符校验:
awk 'NR>1 { if (length(v) > 300 && substr(v, 3, 1) ~ /[km]/) print v } { v = $0 }' txtfile
拆解每部分的作用:
NR>1:从第二行开始执行内部判断,直接跳过首行length(v) > 300:检查缓存的前一行内容长度是否大于300substr(v, 3, 1) ~ /[km]/:提取前一行的第三个字符,判断是否是k或m(正则[km]表示匹配二者之一)v = $0:每次循环都把当前行内容存入变量v,作为下一次判断的“前一行”- 末行会自动被跳过:因为最后一行执行时,没有后续的循环触发
NR>1的判断,所以不会被打印
方法2:先统计总行数,直接过滤首尾行
如果你觉得缓冲区的逻辑有点绕,可以先获取文件的总行数,再直接判断当前行既不是首行也不是末行:
total_lines=$(wc -l < txtfile) awk -v total="$total_lines" 'NR>1 && NR<total && length($0)>300 && substr($0,3,1) ~ /[km]/' txtfile
拆解逻辑:
total_lines=$(wc -l < txtfile):先统计文件的总行数-v total="$total_lines":把总行数传递给Awk的变量totalNR>1 && NR<total:确保当前行不是首行(NR>1)也不是末行(NR<total)- 后面的
length($0)>300和substr(...) ~ /[km]/就是你需要的长度和字符校验条件
两种方法都能实现你的需求,第一种不需要额外统计行数,第二种逻辑更直观,看你习惯哪种啦~
内容的提问来源于stack exchange,提问作者sushma nagabandi
相关产品推荐
相关产品推荐

