这个问题就像一样,找到那些数大于m但小于n的名字。A给出了".csv“文件。最好使用grep (regex)来解决这个问题。
我要这样做:
cat abc.csv|cut -f 3,7 -d ","|grep "4[4-9][0-9]*"|head
但它给了我的不是我想要的
注意:列3是人名,第7列是相应的人数。
任何解决这个问题的建议都会很有帮助。
发布于 2021-07-02 08:14:20
尝试:
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
的示例来重现您的问题。
发布于 2021-07-02 12:44:45
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
)更困难和脆弱。
测试处于数字范围的字段的内容的正确方法是对该字段进行数值比较:
awk -F, '(440<=$7) && ($7<500){print $3}' abc.csv
我猜,如果我猜错了,请根据您在问题中尝试的regexp值来确定范围。
我从其他一些答案中看到,您不希望打印$7
包含.
的行,或者您只想要$7
是整数的行。如果是这样的话,那么使用regexp进行测试是一件琐碎而适当的事情:
awk -F, '($7 !~ /\./) && (440<=$7) && ($7<500){print $3}' abc.csv
或者:
awk -F, '($7 ~ /^[0-9]+$/) && (440<=$7) && ($7<500){print $3}' abc.csv
希望您可以看到,将来您是多么清楚、简单、健壮和易于修改--也就是说,vs试图使用grep跨行使用regexp进行同样的修改。
发布于 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 ","
https://stackoverflow.com/questions/68221040
复制相似问题