如何使用grep统计指定时间段内出版的书籍总数?
解决grep统计指定时间段书籍数量的问题
问题背景
你的图书馆数据文本格式为每行以空格分隔字段,最后一列是出版年份,示例:
ISBN Title Edition Author Year 8298 foo 3 Charles 1999
需要统计1993-2008年间出版的书籍总数。
错误原因分析
- 你第一次尝试的命令
grep -E ', (19(7[5-9]|[89][0-9])|200[0-5])$':数据中字段用空格分隔而非逗号,且年份范围(1975-2005)与需求不符,因此无匹配结果。 - 第二次的正则
\s(197[5-9]|198[0-9]|199[0-9]|200[0-5]):未限定匹配行尾,可能误匹配行内其他位置的四位数字(如ISBN字段),存在准确性隐患。
正确解决方案
利用grep的扩展正则(-E)和统计行数参数(-c),匹配行尾的目标年份范围:
- 年份范围拆解:
- 1993-1999:
199[3-9] - 2000-2008:
200[0-8]
- 1993-1999:
- 最终命令(假设数据文件名为
library_data.txt):
grep -cE '\s(199[3-9]|200[0-8])$' library_data.txt
-c:直接输出匹配的行数(即书籍数量)\s:匹配年份前的空白分隔符$:限定匹配行尾,确保只匹配最后一列的年份
进阶优化
如果数据中字段间可能存在多个空格或制表符,用\s+替代\s,匹配一个或多个空白符:
grep -cE '\s+(199[3-9]|200[0-8])$' library_data.txt
内容的提问来源于stack exchange,提问作者Shan
相关产品推荐
相关产品推荐

