我的问题:
我有两个包含数百万行的大型csv文件。
其中一个文件包含我的服务器数据库的备份,看起来像:
现在我有另一个CSV文件,包含新的代码,具有完全相同的模式。
我想比较这两个文件,并且只找到那些不在服务器上的代码。因为我的朋友生成随机代码,我们想要确保只更新尚未在服务器上的代码。
我尝试使用
首先,我尝试使用
然后我使用了diff来查找newCodesSorted.csv中的新行,例如
我相信你可以直接告诉diff你只想要第二个文件的差异,但是我没有理解如何实现,因此我使用了grep输入,知道稍后会剪切/删除不需要的字符:
因此,我问你是否有任何想法可以改进这种方法。
编辑:
到目前为止,comm效果很好。但是,我忘了提到服务器上的某些代码已经被扫描过了。
但是新代码始终使用isScanned = false进行初始化。因此,newCodes.csv看起来像这样:
其中一个文件包含我的服务器数据库的备份,看起来像:
securityCode,isScanned
NALEJNSIDO,false
NALSKIFKEA,false
NAPOIDFNLE,true
...
现在我有另一个CSV文件,包含新的代码,具有完全相同的模式。
我想比较这两个文件,并且只找到那些不在服务器上的代码。因为我的朋友生成随机代码,我们想要确保只更新尚未在服务器上的代码。
我尝试使用
sort -u serverBackup.csv > serverBackupSorted.csv
和 sort -u newCodes.csv > newCodesSorted.csv
将它们排序。首先,我尝试使用
grep -F -x -f newCodesSorted.csv serverBackupSorted.csv
,但进程被终止,因为它消耗了太多资源,所以我认为必须有更好的方法。然后我使用了diff来查找newCodesSorted.csv中的新行,例如
diff serverBackupSorted.csv newCodesSorted.csv
。我相信你可以直接告诉diff你只想要第二个文件的差异,但是我没有理解如何实现,因此我使用了grep输入,知道稍后会剪切/删除不需要的字符:
diff serverBackupSorted.csv newCodesSorted.csv | grep '>' > greppedCodes
但我相信必须有更好的方法。因此,我问你是否有任何想法可以改进这种方法。
编辑:
到目前为止,comm效果很好。但是,我忘了提到服务器上的某些代码已经被扫描过了。
但是新代码始终使用isScanned = false进行初始化。因此,newCodes.csv看起来像这样:
securityCode,isScanned
ALBSIBFOEA,false
OUVOENJBSD,false
NAPOIDFNLE,false
NALEJNSIDO,false
NPIAEBNSIE,false
...
我不知道是否足够使用“cut -d',' -f1”仅保留代码并使用命令。
我尝试过使用grep和命令,但得到了不同的结果。所以我有点不确定哪一个是正确的方法^^
,false
吗?正确的方法是使用awk
。否则,你将会对每个拥有百万行的文件进行多次遍历。换句话说,你想要跳过其他文件中已经被扫描过的常见名称,即,true
吗? - David C. Rankin