Regex 从文件中删除重复的行

Regex 从文件中删除重复的行,regex,awk,sed,sublimetext3,Regex,Awk,Sed,Sublimetext3,我有一个URL列表,其中大部分是重复的: > http://example.com/some/a-test-link.html > http://example.com/some/a-test-link.html > http://example.com/some/another-link.html > http://example.com/some/another-link.html > http://example.com/some/again-link.htm

我有一个URL列表,其中大部分是重复的:

> http://example.com/some/a-test-link.html
> http://example.com/some/a-test-link.html
> http://example.com/some/another-link.html
> http://example.com/some/another-link.html
> http://example.com/some/again-link.html
> http://example.com/some/again-link.html

我不需要相同的链接两次,所以我需要删除重复的,只保留一个链接。如何使用正则表达式或
sed
awk
实现这一点(我不确定哪种技术最好)。我使用Ubuntu作为操作系统,Sublime Text 3作为编辑器。

不确定这是否适用于您,但是,如果链接的顺序与您发布的顺序一致,下面的正则表达式将为您提供唯一的结果

/(http:\/\/.*?)\s+(?:\1)/gm

使用awk非常简单:

awk '!seen[$0]++' file
这基本上意味着:

awk "!($0 in seen) {seen[$0];print}"
因此,如果该行不在数组中,它将添加到该行并打印它。将跳过阵列中存在的所有后续行

这可能适用于您(GNU-sed):


使用保留空间保留以前看到的URL并删除包含重复内容的行。

您还可以使用排序和uniq的组合:

sort input.txt | uniq

排序对重复链接进行分组,uniq删除所有连续的重复链接。

使用uniq过滤重复链接可能更容易:hello@chrislaplate,是的,它使用
uniq-d filename.txt newname.txt
工作。非常感谢你!但是我们如何使用正则表达式来实现这一点呢?unix工具一次只能处理一行数据
uniq-d
是一种特殊情况,因为它保留前一行用于比较
sed
可以使用正则表达式将一行代码与前一行代码进行比较,但如果您不是专家的话,这并不是
sed
设计的目的
awk
将保留前一行的副本,就像
uniq-d
,但您将只使用字符串比较运算符
=
,而不是正则表达式。如果你想擅长这一点,请阅读O'Reilly
sed和awk
这本书。祝你好运。@Sheller,谢谢你的宝贵意见,我其实是个新手,在实践中学习!不要拿到那本
sed和awk
book。你根本不需要一本书来学习sed的优点(在一行上进行简单的替换),Robins的《有效的Awk编程,第三版》对学习Awk更全面、更流行。你也应该考虑约翰逊的代码<代码> shell脚本配方<代码>。我经常看到这些帖子。您使用什么工具处理输入文件并使用正则表达式创建输出文件?谢谢分享。@Tuga,谢谢你的评论。我刚刚签入了regex1o1,它在那里使用PCRE(PHP)工作,但不知何故,我无法使它与egrep或SublimiteText regex匹配。@TamimIbrahim我认为你应该坚持使用JS answer。我有一个包含50个链接的文件。当我使用你的sed命令过滤我的文件链接时,我只过滤了3个链接,只有前6个链接。它忽略了该文件的其他46个链接。我确实在一个大文件上运行了此操作,并使用了3秒和15秒对其进行排序。因此,如果速度很重要,请使用
排序
+1原始文件是否已排序可能很重要
awk
可能以恒定时间运行,如果输入[部分]排序,
sort
可能更快。当然,如果保证输入是完全排序的,那么您只需使用
uniq
$ sort -u file
> http://example.com/some/again-link.html
> http://example.com/some/another-link.html
> http://example.com/some/a-test-link.html
sort input.txt | uniq
$ sort -u file
> http://example.com/some/again-link.html
> http://example.com/some/another-link.html
> http://example.com/some/a-test-link.html