我有 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
)