【发布时间】:2012-10-07 20:04:53
【问题描述】:
我正在处理 2 个大型 CSV 文件。较小的是较大的子集。第一个字段是非唯一键,即 customerID。
我想从较大的文件中找到与较小文件在字段 1 中具有相同值的所有行,然后找到该结果与原始子集之间的差异。
然后我想从原始子集中删除所有在增量中存在的字段一中具有值的行。
换句话说:我想从原始较小的子集中删除任何行,该子集中的客户ID 也存在于大原始文件中存在的行中,但不存在于较小的子集中。
我目前正在这样做,我不明白为什么结果是0。
我的逻辑显然存在缺陷,这显然不是最优雅的方法,所以,我愿意接受更好的方法的建议。
文件:完整的.csv
,1052,tec101,UNIX
,1052,ser303,UNIX
,1052,backu2,UNIX
,1052,sma114,UNIX
,1052,appsup,UNIX
,1052,emails,UNIX
,1059,marygs,UNIX
,39835,deepr2,UNIX
,44536,hai499,UNIX
,1274,lemo27,Windows
,48567,wdanro,UNIX
,81860,pro846,UNIX
,1419,graphe,UNIX
,83999,doerf1,UNIX
,1551,taxtri,UNIX
,1572,lodes4,UNIX
,1603,wes244,Windows
,102888,law642,UNIX
,1700,au2960,UNIX
文件:subset.csv
,1052,sma114,UNIX
,1052,appsup,UNIX
,1052,emails,UNIX
,1059,marygs,UNIX
,39835,deepr2,UNIX
,44536,hai499,UNIX
,1274,lemo27,Windows
,48567,wdanro,UNIX
,81860,pro846,UNIX
,1419,graphe,UNIX
我现在在做什么:
[jgalley@linux1 sandbox]$ wc -l *
19 full.csv
10 subset.csv
29 total
[jgalley@linux1 sandbox]$ cat subset.csv | awk -F, '{print ","$2","}' > subset_keys
[jgalley@linux1 sandbox]$ grep -F -f subset_keys full.csv | wc -l
13
[jgalley@linux1 sandbox]$ grep -F -f subset_keys full.csv | head -n2
,1052,tec101,UNIX
,1052,ser303,UNIX
[jgalley@linux1 sandbox]$ grep -F -f subset_keys full.csv > subset_keys_grep
[jgalley@linux1 sandbox]$ cat subset_keys_grep | awk -F, '{print ","$2","}' | head -n2
,1052,
,1052,
[jgalley@linux1 sandbox]$ cat subset_keys_grep | awk -F, '{print ","$2","}' | wc -l
13
[jgalley@linux1 sandbox]$ cat subset_keys_grep | awk -F, '{print ","$2","}' > keys_to_remove
[jgalley@linux1 sandbox]$ grep -F -f keys_to_remove subset.csv | wc -l
10
[jgalley@linux1 sandbox]$ grep -F -f keys_to_remove subset.csv > lines_to_remove
[jgalley@linux1 sandbox]$ grep -Fv -f lines_to_remove subset.csv | wc -l
0
我的预期结果应该是 7,或者,如果没有计数,则如下:
,1059,marygs,UNIX
,39835,deepr2,UNIX
,44536,hai499,UNIX
,1274,lemo27,Windows
,48567,wdanro,UNIX
,81860,pro846,UNIX
,1419,graphe,UNIX
结果应该是子集的 7 行,其 customerID 仅存在于子集中,而不存在于完整文件的其他位置。
【问题讨论】:
-
我不太明白你想要做什么。添加一个具体的缩短示例可能会有所帮助,例如有问题的两个文件,但短的 10 行,长的 20 行。然后指出您希望这些文件如何与您提议的过程和结果相对应。
-
好的,我会试着想出一个更简单的例子,实际文件中包含敏感信息,所以我不能只提供一个子集来玩。
-
为什么在结果中排除“,1052,sma114,UNIX”、“,1052,appsup,UNIX”, ...?
-
因为键:1052,在主文件中有记录在子集中不存在但是,1059应该在结果中,所以我编辑了这个。跨度>
-
但是 ",1419,graphe,UNIX" 在
full.csv也有记录。为什么这个包含在结果中?