【问题标题】:Filter with grep a value greater and less than range使用 grep 过滤大于和小于范围的值
【发布时间】:2021-11-22 21:23:39
【问题描述】:

我有一个包含这些数据的 csv:

0,M,19,finnish,english swedish german 
9,M,30,urdu,english 
122,F,26,finnish,english swedish german
83,M,20,finnish,english french swedish 
44,F,20,finnish,english swedish 
10,F,29,finnish,english

我需要一个使用 GREP 的过滤器,而不是让用户值(第一列)大于 10 且小于 99。

这是我最好的动作:

cat demographic_info.csv | grep -e "1[0-9]*" 

【问题讨论】:

  • grep 不理解数值。它只理解文本模式。它不理解“大于10”的概念。

标签: filter grep


【解决方案1】:

假设您想仅匹配从1099 的数字(即,包括1198),您可以使用

grep -E '^(1[1-9]|[2-8][0-9]|9[0-8]),' file

数字范围模式在How to match numbers between X and Y with regexp? 处自动生成,我只需要删除?:,因为 POSIX ERE 不支持非捕获组。

然而,

awk -F\, '$1 < 99 && $1 > 10' file

看起来更适合这项任务。它使用逗号作为字段分隔符,并检查第一个字段值是否小于 99 且大于 10,并仅输出这些行。

查看online demo

#!/bin/bash
s='0,M,19,finnish,english swedish german 
9,M,30,urdu,english 
122,F,26,finnish,english swedish german
83,M,20,finnish,english french swedish 
44,F,20,finnish,english swedish 
10,F,29,finnish,english'
awk -F\, '$1 < 99 && $1 > 10' <<< "$s"
echo "---"
grep -E '^(1[1-9]|[2-8][0-9]|9[0-8]),' <<< "$s"

输出:

83,M,20,finnish,english french swedish 
44,F,20,finnish,english swedish 
---
83,M,20,finnish,english french swedish 
44,F,20,finnish,english swedish 

【讨论】:

  • 您好 Wiktor Stribiżew 感谢您的帮助。没错,使用 awk 会更容易,但我必须使用 GREP,而且我真的不知道该怎么做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
相关资源
最近更新 更多