使用pandas或awk合并非常大的csv

使用pandas或awk合并非常大的csv,pandas,join,awk,Pandas,Join,Awk,我有两个csv,如下所示(试图通过pandas读取它们)df1文件是17GB(我通过pandas read_csv读取),df2是700mb,我想使用trig_seq进行合并。但是蟒蛇会被杀死。有没有办法通过awk/join来实现 >>> df1.head() StreamId SeqNum Timestamp_p1 trig_seq 1 1 14914503 10000000001

我有两个csv,如下所示(试图通过pandas读取它们)df1文件是17GB(我通过pandas read_csv读取),df2是700mb,我想使用
trig_seq
进行合并。但是蟒蛇会被杀死。有没有办法通过awk/join来实现

>>> df1.head()
   StreamId  SeqNum        Timestamp_p1     trig_seq
         1       1                14914503  10000000001
         1       2                  1491450  10000000002
         1       3                   1491450 10000000003
         1       4                  1491450  10000000004
         1       5                    149145  10000000005
>>> df2= pd.read_csv("/tmp/my.csv")
>>> df2.head()
     model_id  order               ctime     trig_seq
         e62  1000000  1493311414272  30021182183
         e62  1000001  149199641344  30021210134
          e22   1000002  1491081210880  30021227875
           e62   1000003  14951949824  30021239627
           e62   1000004  14927136256  30021241522
>>> r1 = pd.merge(df1,df2)
Killed
试试这个-

$ cat f1
         1       1                14914503  10000000001
         1       2                  1491450  10000000002
         1       3                   1491450 10000000003
         1       4                  1491450  10000000004
         1       5                    149145  10000000005
$ cat f2
         e62  1000000  1493311414272  30021182183
         e62  1000001  149199641344  30021210134
          e22   1000002  1491081210880  30021227875
           e62   1000003  14951949824  30021239627
           e62   1000004  14927136256  30021241522
$ awk 'NR==FNR{a[NR]=$0;next} $2 in a {print $0,a[$1]}' f2 f1|column -t
1  1  14914503  10000000001  e62  1000000  1493311414272  30021182183
1  2  1491450   10000000002  e62  1000000  1493311414272  30021182183
1  3  1491450   10000000003  e62  1000000  1493311414272  30021182183
1  4  1491450   10000000004  e62  1000000  1493311414272  30021182183
1  5  149145    10000000005  e62  1000000  1493311414272  30021182183
基本的

awk 'FNR=NR{T[$4]=$3;next}{print $0 OFS T[$2]}' f1 f2 > New.f2
如果出现内存问题,请尝试加载只需要时间戳,但读取两次

awk 'FNR==1 { f++ }
  f==1 { T[$2]; next }
  f==2 && ($4 in T) { T[$4]=$3; next }
  { print $0 OFS t[$2] }
  ' f2 f1 f2 > New.f2

上述输入的最终结果应该是什么样的?df2(较小的文件)应该只有df1中额外的一列时间戳_p1。它使用“trig_seq”映射的是在
df1
中唯一匹配的行,例如,您希望将时间戳从
df1
合并到
df2
,因此您希望通过匹配的
trig_seq
过滤
df1
,那么,这些匹配是否唯一且不重复,因此
df1
say具有100万个唯一触发器,而
df2
包含其中的一个子集