使用正则表达式删除重复行

时间:2014-04-18 21:19:16

标签: regex awk sed sublimetext3

我有一个html链接列表,其中大部分都是重复的,如下例所示 - >

> 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文本3。

由于

5 个答案:

答案 0 :(得分:4)

使用awk非常简单:

awk '!seen[$0]++' file

基本上意味着:

awk "!($0 in seen) {seen[$0];print}"

因此,如果该行不在数组中,它将添加到它并打印它。将跳过所有后续行(如果它们存在于数组中)。

$ cat file
> 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
$ awk '!seen[$0]++' file
> http://example.com/some/a-test-link.html
> http://example.com/some/another-link.html
> http://example.com/some/again-link.html

答案 1 :(得分:3)

$ 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

答案 2 :(得分:2)

不确定这是否适合您,但是,如果链接符合您发布的顺序,则以下正则表达式将为您提供独特的结果。

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

http://regex101.com/r/zB0pW3

答案 3 :(得分:2)

这可能适合你(GNU sed):

sed -r 'G;/(http[^\n]*)\n.*\1/d;s/\n.*//;H' file

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

答案 4 :(得分:2)

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

sort input.txt | uniq

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