python - 在一个巨大的文件(约 100 万条记录)上 grep 一个长长的(约 2000 个)不同模式列表
问题描述
我有一个以 csv 格式下载的文件,其中包含来自数据库转储的近 100 万条记录,如下所示,我有另一个文件 grep_types.sh 执行数千种不同的 grep 组合。谁能告诉我如何在 bash 或 python 中以 config + 函数样式进行以下操作(因为维护像 grep_types.sh 这样的文件很头疼)
db_details.csv
permalink,company,numEmps,category,city,state,fundedDate,raisedAmt,raisedCurrency,round
lifelock,LifeLock,,web,Tempe,AZ,1-May-07,6850000,USD,b
lifelock,LifeLock,,web,Tempe,AZ,1-Oct-06,6000000,USD,a
lifelock,LifeLock,,web,Tempe,AZ,1-Jan-08,25000000,USD,c
mycityfaces,MyCityFaces,7,web,Scottsdale,AZ,1-Jan-08,50000,USD,seed
flypaper,Flypaper,,web,Phoenix,AZ,1-Feb-08,3000000,USD,a
infusionsoft,Infusionsoft,105,software,Gilbert,AZ,1-Oct-07,9000000,USD,a
gauto,gAuto,4,web,Scottsdale,AZ,1-Jan-08,250000,USD,seed
chosenlist-com,ChosenList.com,5,web,Scottsdale,AZ,1-Oct-06,140000,USD,seed
chosenlist-com,ChosenList.com,5,web,Scottsdale,AZ,25-Jan-08,233750,USD,angel
我的文件有几千条 grep 行,如下所示(我在开始时使用了一个额外的操作 cat 文件,以使整个文件有点整洁和易于理解)
grep_types.sh
cat db_details.csv | grep ',5,' | grep -v ',angel$' > /tmp/type1.csv
cat db_details.csv | egrep -i ',LifeLock,|gauto' | grep -i 'may' | grep -iv 'dec' >> /tmp/type2.csv
寻找更好的方法/建议来处理此类操作:)
解决方案
我建议您将 grep 脚本替换为一个 awk 脚本,该脚本可以在一次扫描文件中完成所有这些操作并节省大量时间。
例如
grep ',5,' | grep -v ',angel$' > /tmp/type1.csv
可以(我的解释)
$ awk -F, '$3==5 && $NF!="angel" {print > "/tmp/type1.csv"}
# other conditional statements
# ...
' db_details.csv
另一个好处是您可以设置目标字段条件,$3==5
而不是搜索所有行并获得可能的误报。
推荐阅读
- reactjs - 根据服务器通知更新 React 组件
- apache-spark - 来自 /192.168.2.13:46500 的连接关闭时仍有 1 个请求未完成
- c++ - 键入特征样式以测试 T 是 basic_string<> 还是可打印的类似字符串的类型?
- c# - 如何在 xamarin 表单中使用广播接收器获得通知?
- mysql - 如何将 Go time.Time 转换为 MySQL 日期时间?
- jsp - 如何在另一个文件夹中包含带有图像的jsp文件
- pyspark - 用于否定列的 Pyspark 函数
- python - Groupby并删除Python中的上异常值
- r - 使用 coxed 包模拟 Cox 模型的数据
- sql - 连接两个 SQL 表 - 来自表 1 的按列分组,而不是来自表 2