我有一个 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