2017-01-23 20 views
1

我有兩個csv(A有300 000行,B有1 000 000行)。記錄通過列ID(關係1-1)關聯,但不具有相同的列順序,並且不是按ID順序排列。我需要獲得700條000線B的針對ID爲A.有效比較兩個csv和+300000記錄(用awk?)

A.csv

A.ID,A.Field01,A.Field02 
2,a,d      
4,b,e      
1,c,f   

B.csv

B.Field01,B.ID,B.Field02 
g,2,f 
f,4,r 
h,6,k 
a,1,3 

(我想選擇小時,6不存在,k)

我想我可以使用像sqlite這樣的sgbd來解決它,但我相信它可以通過更簡單,更高效的方法來完成,比如awk。

我想,使該命令,我發現:

awk 'ARGIND==1 {x[$0]++; next} !x[$0]' B.csv A.csv 

然而,這比較整行,我不知道如何選擇具體A.ID和B.ID作爲要比較的字段。

我也很感興趣的任何其他有效的方法來解決這個問題!

乾杯

回答

5
$ awk -F"," 'FNR==NR{a[$1];next}!($2 in a)' a b 
B.Field01,B.ID,B.Field02 
h,6,k 
+0

謝謝!這正是我所期待的。我也讚賞其他的貢獻和意見。祝一切順利。 – Megamini

3

更新:

我本來預計這一性能比James Brown's awk solution更好,但我的測試不能證明這一點。

我測試過兩個文件,都包含700.000行。 awk解決方案明顯更快。

awk解決方案需要與B.csv的id列一樣多的內存。這就是爲什麼,對於一個真正的(真正的!)大型B.csv來說,加入解決方案可能是唯一可行的解​​決方案。如果A.csv和B.csv已經被排序,那麼當然這會更好,因爲sort命令佔用大部分時間。


即使這需要兩個輸入文件進行排序,我想join命令將在這種情況下執行得很好:

join -v2 -t, -11 -22 <(sed 1d A.csv|sort -t, -k1,1) <(sed 1d B.csv|sort -t, -k2,2) 

說明:

join 
---- 

-v2 only report lines with id unique to file2 
-t, input/output field separator 
-11 use field 1 from field 1 as id 
-22 use field 2 from field 2 as id 

sed 
--- 

1d removes the headers 


sort 
---- 

-t, delimiter 
-k1,1 sort based on field 
+1

聯接解決方案應該比awk更高效。 OP說300k行,所以它是一個大文件。 +1 – NinjaGaiden

+1

我經常喜歡sed頭部/尾部有「花哨」選項。這裏:'sed 1d file' –

+0

@glennjackman對於可移植的shell腳本'sed'是更好的選擇,我同意。 – hek2mgl