Grep 具有特定起始字符的值范围

Grep 具有特定起始字符的值范围

我有 10GB 文件,我想在其中计算某些特定文本(即 TY[0-9])的出现次数。

示例文件:

ABC,2A,2018-07-06,2018-06-20 00:00:00
BCD,TY1,2018-07-06,2018-06-20 00:00:00
EFG,TY2,2018-07-06,2018-06-20 00:00:00
IGH,2A,2018-07-06,2018-06-20 00:00:00

我想获取以TY数字开头的所有文本的计数。我尝试使用egrep,但没有得到正确的结果。

egrep  "^TY[0-9]" Filename

答案1

您尝试的解决方案的主要问题是,它假设刺痛TY发生在行的开头(您将表达式用 锚定在那里^),但事实并非如此。它出现在第二个逗号分隔字段的开头。


用于awk计算文件中第二个逗号分隔字段以字符串开头后跟数字的次数TY

awk -F, '$2 ~ /^TY[[:digit:]]/ { n++ } END { print n }' filename

我想知道cut与 结合使用是否grep会很快?删除第二列将提供grep更少的数据来处理,因此它可能比grep单独更快。

cut -d, -f2 filename | grep -c '^TY[[:digit:]]'

...但我不确定。


在我的 OpenBSD 系统上使用 1.1GB 文件进行一些测试后,+cut实际上比(8 秒与 15 秒)grep快了近 50% 。awk和纯grep溶液(grep -Ec '\<TY[0-9]' filename,取自格伦的解决方案)需要 13 秒。

因此,如果仅从第二个字段中选取字符串,则在匹配之前仅提取该字段可能会节省一些时间。

答案2

您想使用单词边界而不是行首锚点:

$ grep -Ec '\<TY[0-9]' file
2

注意:这是所有的计数线带有“TY字”。它不是所有“TY 单词”的计数。如果每行可以有多个,那么

$ grep -Eo '\<TY[0-9]' file | wc -l

答案3

,如果您想要查找以任意数量的十进制数字开头TY并后跟该数字的分隔字段的出现次数,您可以执行以下操作:

<file perl -lne '$n += () = /(?<![^,])TY\d+(?![^,])/g; END{print 0+$n}'

输入如下:

TY1,TY2,TY,TYFOO
TY213,X-TY2,TY4

将返回4( TY1, TY2, TY213, TY4)。

(?<!...)(?!...)分别是负向向后看和向前看操作符。因此,在这里,我们要查找TY后跟一个或多个 ( +) 数字 ( \d),前提是其前面和后面都没有除 之外的字符,

另一种方法是将 s 转换为换行符,并计算以 开头后跟一个或多个数字,的结果行数:TY

<file tr , '\n' | LC_ALL=C grep -xEc 'TY[[:digit:]]+'

(在我的系统上,这大约是解决方案的 10 倍perl

相关内容