我正在处理 2 个大型 CSV 文件。较小的是较大的子集。第一个字段是非唯一键,即 customerID。
我想从较大的文件中找到与较小文件在字段 1 中具有相同值的所有行,然后找到该结果与原始子集之间的增量。
然后,我想从原始子集中删除在增量中存在的字段一中具有值的所有行。
换句话说:我想从原始较小子集中删除任何行,该子集中具有 customerID 也存在于大原始文件中存在的行中,但不存在于较小子集中。
我目前正在这样做,但我不明白为什么结果为 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 仅存在于子集中,而不存在于完整文件的其他位置。