如何使用GREP正则筛选CSV中数值在[m,n)区间的对应人名
现有命令不符合预期的原因
- 你切割后输出的字段顺序是
姓名,第7列数值,正则没有限定匹配位置,可能会匹配到姓名中包含对应数字的记录,产生误匹配 - 硬编码的正则
4[4-9][0-9]*仅能匹配44开头的正整数,无法适配任意m、n的范围,且没有限定匹配长度,会把440、4400等超出目标范围的数值也匹配到 - 正则默认是模糊匹配,没有做首尾边界限制,会出现大量误判
优先使用grep的实现方案
使用grep实现需要先把第7列放在输出的最前面,再用正则限定仅匹配行首的数值,同时根据你的m、n值写对应的数值范围正则,举两个常用场景示例:
- 筛选第7列≥44且<50的整数,提取对应姓名
cut -d ',' -f 7,3 abc.csv | grep '^4[4-9]$' | cut -d ',' -f 2
- 筛选第7列≥100且<250的整数,提取对应姓名
cut -d ',' -f 7,3 abc.csv | grep -E '^(1[0-9]{2}|2[0-4][0-9])$' | cut -d ',' -f 2
注意:如果第7列是带小数的数值,需要调整正则适配小数位,比如筛选≥44.5且<50的数值,正则改为
^44\.[5-9][0-9]*|4[5-9](\.[0-9]+)?$
更简便的替代方案
如果数值范围复杂写正则成本高,用awk做数值比较更灵活,不需要调整逻辑直接修改m、n的赋值即可:
awk -F ',' '$7 >= m && $7 < n {print $3}' m=你的m值 n=你的n值 abc.csv
内容的提问来源于stack exchange,提问作者Nobita Nobi
相关产品推荐
相关产品推荐

