有没有办法使用 shell 工具从列表中删除重复项和冗余子串?“冗余”是指包含在另一个字符串中的字符串,因此“foo”与“foobar”和“barfoo”是多余的。例如,拿这个列表:
abcd
abc
abd
abcd
bcd
Run Code Online (Sandbox Code Playgroud)
并返回:
abcd
abd
Run Code Online (Sandbox Code Playgroud)
uniq,sort -u并awk '!seen[$0]++'有效删除重复项但不删除
冗余字符串:
如何删除文件中的重复行而不在 Unix 中对其进行排序?删除重复行而不排序
我可以递归地遍历每一行,grep但这对于大文件来说很慢。(我有大约 10^8 行要处理。)这里有一种在 Python 中使用循环的方法:根据部分字符串和 Bash删除冗余字符串:How to check if a string contains a substring in Bash但我正在尝试避免循环。编辑:我的意思是这里的嵌套循环,感谢@shellter 的澄清
有没有办法将 awk 的match()函数与数组索引一起使用?这种方法逐步构建数组,因此不必搜索整个文件,因此对于大文件应该更快。还是我错过了其他一些简单的解决方案?
理想的解决方案将允许匹配指定的列,如上述方法。
编辑
以下两个答案都有效,非常感谢您的帮助。目前在真实数据集上测试性能,将更新结果并接受答案。我在同一个输入文件上测试了这两种方法,该文件有 430,000 行,其中 417,000 行是非冗余的。作为参考,我原来的循环 grep 方法用了 7 小时 30 米处理这个文件。
更新:
James Brown 的原始解决方案耗时 3 小时 15 分,而 Ed Morton 的解决方案耗时 8 …