使用pandas或awk合并2个大致不相等的文件

时间:2017-04-10 15:04:29

标签: python awk

我有2个需要合并的csv,File1在20gb左右,而其他只有~1000行。由于大尺寸我首先迭代更大的文件,并希望将较大的文件(比如file1)过滤为较小的文件,然后使用pandas加载/合并

File1:较大的文件如下

col1,col2,col3
1,1,1491795901021327897
1,2,1491795901021342873
1,3,1491795901021347247
1,4,1491795901021351620
1,5,1491795901021356612
1,6,1491795901021361172
1,7,1491795901021366797

较小的文件如下

col1,col2,col3,col4,col5,col6
val1,val2,val3,1,6,1412414141412414
val1,val2,val3,1,3,1434252352352325

我做的一种方法是通过执行10*10**10(value at col1) + val at col2从两个文件创建单个密钥,类似地使用col4,5在较小的文件中创建。将此值保存为列表,如果列表中存在值,则将该值保存为较大文件中的每一行。最后打印一个小的过滤文件。有没有更好的方法在python中使用awk或者使用awk。

最终意图是合并,但由于20gb无法加载到熊猫中,因此我会过滤我的文件并使其变小。我确信必须有更好的方法来解决这个问题。

2 个答案:

答案 0 :(得分:0)

awk救援!

通过推断,我认为这就是你想要的

$ awk 'BEGIN        {FS=OFS=","} 
       NR==1        {h=$0; next} 
       NR==FNR      {a[$4,$5]=$0; next} 
       FNR==1       {print h,$3} 
       ($1,$2) in a {print a[$1,$2],$3}' small large

col1,col2,col3,col4,col5,col6,col3
val1,val2,val3,1,3,1434252352352325,1491795901021347247
val1,val2,val3,1,6,1412414141412414,1491795901021361172

它应该很容易阅读,但如果我得到有关我的解释的反馈,我可以写解释。

答案 1 :(得分:0)

试试这个 -

$ head f?
==> f1 <==
col1,col2,col3
1,1,1491795901021327897
1,2,1491795901021342873
1,3,1491795901021347247
1,4,1491795901021351620
1,5,1491795901021356612
1,6,1491795901021361172
1,7,1491795901021366797

==> f2 <==
col1,col2,col3,col4,col5,col6
val1,val2,val3,1,6,1412414141412414
val1,val2,val3,1,3,1434252352352325
$ awk -F, 'NR==FNR{a[$4 FS $5]=$6;next} ($1 FS $2) in a {print $0 FS a[$1 FS $2]}' f2 f1
1,3,1491795901021347247,1434252352352325
1,6,1491795901021361172,1412414141412414

解释 -

使用文件$4FS$5中的f2创建密钥,并将其与文件$1FS$2的{​​{1}}密钥匹配,f1 $4FS$5f2$1FS$2匹配,然后打印文件f1中的所有内容以及文件$6中的f2