基于两列比较两个大型无序CSV文件
我需要比较两个大的、没有排序的 .csv
文件,主要是看它们的第一列和第三列。每个文件大约有20万条记录。最后的结果我想知道哪些记录在第一个文件中存在,但在第二个文件中不存在。这两个文件都是用逗号分隔的值文件。在比较的时候,第三列的内容不区分大小写。
示例文件1:
"id", "name", "email", "country"
"1233", "jake", "jake@mailinator.com", "USA"
"2345", "alison", "Alison@mailinator.com", "Canada"
"3456", "jacob", "jacob@mailinator.com", "USA"
"5678", "natalia", "natalia@mailinator.com", "USA"
文件2
"id", "name", "email", "country"
"2345", "alison", "alison@mailinator.com", "Canada"
"3456", "jacob", "jacob@mailinator.com", "USA"
"5690", "lina", "lina@mailinator.com", "Canada"
期望的输出文件
"5678", "natalia", "natalia@mailinator.com", "USA"
如果能提供一些代码示例,那就太好了。
5 个回答
0
把文件里的内容加载到一个内存数据库里,比如说 H2,然后用SQL语句进行选择,并且可以用连接查询。
0
先把文件一个个读进来,放到两个数组(或者说哈希表)里。然后再读第二个文件,把每一行放到一个数组里。如果 array1[n]
和 array2[n]
这两个数组里的内容在当前行的数组里找不到,就输出“缺失”。我会用Perl来做这个任务。
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) 我首先创建一个复合键列,也就是把第一列和第三列合并在一起:
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) 接着我使用 join
命令,按照第一列(我的复合键)进行连接,并输出来自文件1的无法配对的行。
输出结果:
"1233", "jake", "jake@mailinator.com", "USA"
"5678", "natalia", "natalia@mailinator.com", "USA"