首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于GREP的过滤

基于GREP的过滤
EN

Stack Overflow用户
提问于 2021-07-02 07:13:40
回答 4查看 478关注 0票数 1

这个问题就像一样,找到那些数大于m但小于n的名字。A给出了".csv“文件。最好使用grep (regex)来解决这个问题。

我要这样做:

代码语言:javascript
运行
复制
cat abc.csv|cut -f 3,7 -d ","|grep "4[4-9][0-9]*"|head

但它给了我的不是我想要的

注意:列3是人名,第7列是相应的人数。

任何解决这个问题的建议都会很有帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-07-02 08:14:20

尝试:

代码语言:javascript
运行
复制
cut -d, -f 3,7 Bulk.csv | grep ',4[0-9][0-9][^0-9]' | cut -d, -f 1

说明:cat是不必要的。表达式[^0-9]意味着除一个数字之外的所有东西;只使用,4[0-9][0-9]作为正则表达式也会选择包含小数点之前有更多数字的数字的行,比如4247.14,这不是您想要的。

我们缺少一个输入文件Bulk.csv的示例来重现您的问题。

票数 0
EN

Stack Overflow用户

发布于 2021-07-02 12:44:45

代码语言:javascript
运行
复制
Some people, when confronted with a problem, think "I know,
I'll use regular expressions." Now they have two problems.

(参考见https://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/ )。

这并不是如何使用grep的一个很好的例子,因为有很好的文档表明,使用regexp进行数值比较比仅仅比较数字(例如awk )要困难得多,而且当数据处于特定字段时,在行上使用grep也比使用理解字段的工具(例如awk )更困难和脆弱。

测试处于数字范围的字段的内容的正确方法是对该字段进行数值比较:

代码语言:javascript
运行
复制
awk -F, '(440<=$7) && ($7<500){print $3}' abc.csv

我猜,如果我猜错了,请根据您在问题中尝试的regexp值来确定范围。

我从其他一些答案中看到,您不希望打印$7包含.的行,或者您只想要$7是整数的行。如果是这样的话,那么使用regexp进行测试是一件琐碎而适当的事情:

代码语言:javascript
运行
复制
awk -F, '($7 !~ /\./) && (440<=$7) && ($7<500){print $3}' abc.csv

或者:

代码语言:javascript
运行
复制
awk -F, '($7 ~ /^[0-9]+$/) && (440<=$7) && ($7<500){print $3}' abc.csv

希望您可以看到,将来您是多么清楚、简单、健壮和易于修改--也就是说,vs试图使用grep跨行使用regexp进行同样的修改。

票数 1
EN

Stack Overflow用户

发布于 2021-07-02 08:58:05

如果只需要名称,则必须添加:

cut -f 1 -d ","

如果您只需要400.00到499.99年间的实际数字(正如我从您的结果中看到的),那么grep应该是:

grep "4[0-9][0-9]\.[0-9][0-9]"

如果您需要接受任意数量的小数和整数,并处理可选的尾随空格和行尾($),您可以使用:

grep -E "4[0-9][0-9](\.[0-9][0-9]*)* *$"

如果您需要确保它与1400或包含400的名称不匹配,那么您应该使用:

grep -E " *, *4[0-9][0-9](\.[0-9][0-9]*)* *$"

我们可以继续,但我会停在这里。我的建议是这样做:

cat Bulk.csv | cut -f 3,7 -d "," | grep -E " *, *4[0-9][0-9](\.[0-9][0-9]*)* *$" | cut -f 1 -d ","

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68221040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档