有没有办法在Unix中删除文件中的重复行?
我可以使用sort -u和uniq命令,但我想使用sed或awk.那可能吗?
我环顾四周,不确定这是否可行,但是这里有:
我有一个(javascript)文件(比如/lib/client.js),其中我有一个唯一的标识符分配给变量,如下所示:
var identifier = "SOME_IDENTIFIER";
您可以将标识符视为版本号:我们会定期将此变量更改为新标识符.
我想做的是找到我们曾经使用过的所有唯一标识符.我怎么能用git做到这一点?
我想可能有办法搜索git历史记录,并打印行匹配"var identifier =".我可以手动删除这个列表.
无论如何,我很欣赏这里的任何见解.谢谢.
我正在尝试删除图像,我得到:
# docker rmi f50f9524513f
Failed to remove image (f50f9524513f): Error response from daemon: conflict: unable to delete f50f9524513f (cannot be forced) - image has dependent child images
Run Code Online (Sandbox Code Playgroud)
这是docker版本:
# docker version
Client:
Version: 1.10.3
API version: 1.22
Go version: go1.5.3
Git commit: 20f81dd
Built: Thu Mar 10 21:49:11 2016
OS/Arch: linux/amd64
Server:
Version: 1.10.3
API version: 1.22
Go version: go1.5.3
Git commit: 20f81dd
Built: Thu Mar 10 21:49:11 2016
OS/Arch: linux/amd64
Run Code Online (Sandbox Code Playgroud)
但没有额外的信息:
# docker images --format="raw" | grep f50f9524513f …Run Code Online (Sandbox Code Playgroud) 假设您有以下文字:
abc
123
abc
456
789
abc
abc
Run Code Online (Sandbox Code Playgroud)
我想删除所有"abc"行,只保留一行.我不介意排序.结果应该是这样的:
abc
123
456
789
Run Code Online (Sandbox Code Playgroud) 我只有一个包含多行的file.txt,我想删除重复的行而不对文件进行排序.我可以在unix bash中使用什么命令?
file.txt的样本
orangejuice;orange;juice_apple
pineapplejuice;pineapple;juice_pineapple
orangejuice;orange;juice_apple
Run Code Online (Sandbox Code Playgroud)
输出样本:
orangejuice;orange;juice_apple
pineapplejuice;pineapple;juice_pineapple
Run Code Online (Sandbox Code Playgroud) 我有一个愚蠢的大文本文件(即今天的40千兆字节),我想在没有排序文件的情况下过滤唯一的行.
该文件具有unix行结尾,并且所有内容都匹配[[:print:]].我尝试了以下awk脚本只显示唯一的行:
awk 'a[$0] {next} 1' stupid.txt > less_stupid.txt
Run Code Online (Sandbox Code Playgroud)
我的想法是,我通过引用其元素来填充数组,使用文件的内容作为键,然后跳过已经在数组中的行.但这有两个原因失败 - 首先是因为它莫名其妙地不起作用(即使是在小型测试文件上),其次是因为我知道在将整组唯一行加载到内存之前我的系统会耗尽内存通过awk.
搜索后,我发现这个答案建议:
awk '!x[$0]++'
Run Code Online (Sandbox Code Playgroud)
虽然这适用于小文件,但在读取整个文件之前也会耗尽内存.
什么是更好(即工作)的解决方案?我对任何事情都持开放态度,尽管我更倾向于使用我所知道的语言解决方案(bash&awk,因此标签).在尝试可视化问题时,我提出的最好的方法是存储一系列行校验和或MD5而不是行本身,但这只会节省一点空间并冒着校验和冲突的风险.
任何提示都会非常受欢迎.告诉我这是不可能的也是受欢迎的,所以我不想试图解决它.:-P
有没有办法使用 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 …
如果我有这样的csv文件
lion@mammal@scary animal
human@mammal@human
hummingbird@bird@can fly
dog@mammal@man's best friend
cat@mammal@purrs a lot
shark@fish@very scary
fish@fish@blub blub
Run Code Online (Sandbox Code Playgroud)
我有另一个像这样的csv文件
cat@mammal@purrs a lot
shark@fish@very scary
fish@fish@blub blub
rockets@pewpew@fire
banana@fruit@yellow
Run Code Online (Sandbox Code Playgroud)
我希望输出如下:
lion@mammal@scary animal
human@mammal@human
hummingbird@bird@can fly
dog@mammal@man's best friend
cat@mammal@purrs a lot
shark@fish@very scary
fish@fish@blub blub
rockets@pewpew@fire
banana@fruit@yellow
Run Code Online (Sandbox Code Playgroud)
第一个csv文件中的一些内容存在于第二个csv文件中; 它们重叠很多.如何将这些csv文件与正确的顺序组合?保证新条目始终是第一个csv文件开头的前几行.