【发布时间】:2021-03-28 12:19:51
【问题描述】:
我的问题: 我有 2 个大 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 你只想要与第二个文件的区别,但我不明白如何,因此我知道我剪切/删除了不需要的字符之后:
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,一次用 comms 得到不同的结果。所以我有点不确定,哪个是正确的方法^^
【问题讨论】:
-
请发布其他 csv 文件的一些示例以进行测试和预期输出。将它们添加到您的问题中,不要将它们作为 cmets 或图像发布。谢谢。
-
你只关心检查代码为
,false的新文件吗?正确的方法是使用awk。否则,您最终会对每一个百万行文件进行多次传递。也就是说,要不要跳过其他文件中已经扫描过的常用名,true?