首页 > 解决方案 > 在一个巨大的文件(约 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

寻找更好的方法/建议来处理此类操作:)

标签: pythonbashshellawkgrep

解决方案


我建议您将 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而不是搜索所有行并获得可能的误报。


推荐阅读