2011-08-09 69 views
1

我是基於列1和列表3比較2大型未排序.csv文件的任務。 每個文件包含大約200k條記錄。對於輸出,我需要知道基於第1列和第3列的記錄存在於第一個文件中,而不是第二個文件中。這些文件是用逗號分隔的值文件引用的。比較時,第3列需要忽略大小寫。比較2列基於2列的大型未排序CSV文件

例File1中:

"id", "name", "email", "country" 
"1233", "jake", "[email protected]", "USA" 
"2345", "alison", "[email protected]", "Canada" 
"3456", "jacob", "[email protected]", "USA" 
"5678", "natalia", "[email protected]", "USA" 

文件2

"id", "name", "email", "country" 
"2345", "alison", "[email protected]", "Canada" 
"3456", "jacob", "[email protected]", "USA" 
"5690", "lina", "[email protected]", "Canada" 

期望的輸出文件

"5678", "natalia", "[email protected]", "USA" 

代碼示例將是非常讚賞。

+0

哪種語言,看你到目前爲止做了什麼問題呢? – Mark

+0

爲什麼「'1233」,「jake」,「[email protected]」,「USA」'行不出現在輸出中? – brandizzi

+0

嗨馬克,我嘗試了Java,使用HashMaps,它超級慢。 – Tanya

回答

1

嘗試:

join -v 1 -i -t, -1 1 -2 1 -o 1.2 1.3 1.4 1.5 <(awk -F, '{print $1":"$3","$0}' f1.txt | sort) <(awk -F, '{print $1":"$3","$0}' f2.txt | sort) 

它是如何工作的:

1)我第一次創建複合鍵列,通過加入第1列和欄3:

awk -F, '{print $1":"$3","$0}' f1.txt 
awk -F, '{print $1":"$3","$0}' f2.txt 

2)我有點既輸出:

awk -F, '{print $1":"$3","$0}' f1.txt | sort 
awk -F, '{print $1":"$3","$0}' f2.txt | sort 

3)I然後使用join命令加入在第一列上(我的複合鍵)和輸出該unpairable線從文件來1.

輸出:

"1233", "jake", "[email protected]", "USA" 
"5678", "natalia", "[email protected]", "USA" 
+0

+1列3應該不區分大小寫,所以只需要'tolower($ 3)'而不是。 –

+1

@ glenn-jackman我正在使用'join -i'來忽略大小寫。 – dogbane

+0

awk命令的工作就像一個魅力,但加入抱怨,1)它說-i不是一個有效的選項 使用: GNU bash,版本3.2.48(1) - 釋放(x86_64-apple-darwin10.0)版權所有(C)2007自由軟件基金會,公司 – Tanya

0

循環文件,將它們加載到2個數組(或者哈希)中,然後循環第二個文件,數組每行。如果array1[n]array2[n]不在當前行的數組中,則輸出爲缺失。我會爲此任務使用Perl。

+0

檔案很大。將它們加載到數組中可能不明智。 – dogbane

+0

然後對於基礎文件中的每一行,在第二個文件中逐行搜索。沒有那麼快,但你不會遇到內存問題。 – atrain

0
awk 'BEGIN { FS="\", \""} 
    FNR == 1 {read++;} 
    FNR !=1 {if (read==1) {store[$1","tolower($3)] = $0} if (read==2) {delete store[$1","tolower($3)]}} 
    END {for (i in store) {print store[i]}}' file1 file2 

輸出:

"1233", "jake", "[email protected]", "USA" 
"5678", "natalia", "[email protected]", "USA" 
0

將文件內容加載到內存數據庫中,例如H2並使用SQL選擇了加盟

0
awk 'BEGIN { FS=OFS=","}; NR==FNR{a[tolower($1$3)]=++i;next} { if (tolower($1$3) in a);else {print } }' file2 file1 

輸出:

"1233", "jake", "[email protected]", "USA" 
"5678", "natalia", "[email protected]", "USA"