使用非常大的输入 CSV 文件来 Grepping 一列 CSV 文件

使用非常大的输入 CSV 文件来 Grepping 一列 CSV 文件

我有一个 300Gb 大小的文件夹,其中包含大量数据(约 2GB)CSV文件。我的工作是从这些文件中提取特定的行,这些行在特定的列中有一个值,并且这个值也存在于我拥有的输入文件(大小也是 2GB)中。

我目前正在尝试使用python基于方法熊猫来获取我想要的数据,但是这个过程非常慢,并且由于限制,我必须将输入文件和文件夹中的每个文件作为块读取,这需要相当长的时间:

all_wow_files = glob.glob('/media/noname365/0205D5FE310DDEEC/bing_verticals_wow_job/US_WOW/*_Keywords.csv')

for file in all_wow_files:

    print(file)

    for chunk in pd.read_csv(file, chunksize=500000):

            for chunk_dupe in pd.read_csv('input_file.csv',chunksize=500000, names=['Keyword']):

                keyword_list = set(chunk_dupe['Keyword'].tolist())

                chunk = chunk[chunk['Keyword'].isin(keyword_list)]

                chunk.to_csv(output_file,index=False, mode='a')

是否有特定的命令bash可以让我更快地完成工作?我真的不想为了比较而将整个输入文件读入内存……

编辑:

文件夹中的文件通常是这样构建的,在我的输出中我需要包含所有列:

Parent ID, ID, Keyword 
1            1  yodel
1            2  keyworks
1            3  puppy dog
2            4  see-saw
...........

而我使用的输入文件只是一列字符串:

apple
banana
orange
see-saw
moneybags
.....

答案1

这个 awk 脚本可以完成这项工作(并且不会将整个文件加载到内存中)

awk -F\; '/Keyword/' input.csv >output.csv 

假设分隔符为;,关键字为Keyword,输入文件为input.csv,输出文件为output.csv

如果您想要搜索包含关键字的特定列,您应该使用类似以下内容:

awk -F\; '$5==Keyword' input.csv >output.csv 

或者

awk -F\; '$5==Keyword {print}' input.csv >output.csv

要搜索多个关键字,您可以使用以下命令:

awk -F\; '$5==Keyword1 || $6==Keyword2 {print}' input.csv >output.csv

相关内容