2011-08-09 68 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"