2017-04-10 41 views
0

我有2個CSV需要合併2個很大程度上不平等的文件,文件1是圍繞20gb等只有~1000線。因爲大尺寸的餘第一迭代更大文件和要過濾的更大的文件(比如文件1),以更小的文件,然後加載/合併使用大熊貓合併使用熊貓或AWK

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也許。

終極目的是要合併,但由於20GB不能在大熊貓被加載,所以我過濾我的文件,使之更小。我確定必須有更好的方法來解決這個問題。

+0

請您粘貼預期的輸出? –

+0

什麼是合併的公用密鑰,給使用發佈的數據,什麼將成爲合併後的文件結構的例子嗎?你是否通過匹配'4,5'字段到'1,2'來過濾基於小文件的大文件? – karakfa

+0

'您是否通過將第4,5個字段與1,2進行匹配來過濾基於小文件的大文件? '是的確實是 – pythonRcpp

回答

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 

應該很容易讀什麼,但我能寫的解釋,如果我得到我的解釋反饋。

+0

你的解釋是正確的。你能不能請添加你的解釋:) – pythonRcpp

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並以文件 f1$1FS$2關鍵匹配它,如果 f2 $4FS$5$1FS$2匹配,然後打印出所有內容

創建的密鑰從文件f1$6從文件f2一起。