如何删除具有相同域的行

时间:2014-07-09 09:31:26

标签: bash perl sed cmd

拥有100万行的大型txt文件。 例如:

http://e-planet.ru/hosting/
http://www.anelegantchaos.org/
http://site.ru/e3-den-vtoroj/
https://escrow.webmoney.ru/about.aspx
http://e-planet.ru/feedback.html

如何清除具有相同域的行?

我需要清除http://e-planet.ru/hosting/http://e-planet.ru/feedback.html

之一

4 个答案:

答案 0 :(得分:2)

我一开始并不理解你的问题。这是一个awk 1-liner:

awk -F'/' '!a[$3]++' myfile

测试输入:

http://e-planet.ru/hosting/
http://www.anelegantchaos.org/
http://site.ru/e3-den-vtoroj/
https://escrow.webmoney.ru/about.aspx
http://e-planet.ru/feedback.html
https://escrow.webmoney.ru/woopwoop
httpp://whatever.com/slk

输出:

http://e-planet.ru/hosting/
http://www.anelegantchaos.org/
http://site.ru/e3-den-vtoroj/
https://escrow.webmoney.ru/about.aspx
httpp://whatever.com/slk

此处,http://e-planet.ru/https://escrow.webmoney.ru/的第二次出现将被删除。

此脚本使用/作为分隔符拆分行,并比较第3列(域)以查看是否存在重复项。如果它是唯一的,它将被打印。需要注意的是,只有当所有网址前面都有whateverprotocol//时,它才有效。双斜杠很重要,因为这是使第3列成为域

的原因

答案 1 :(得分:1)

use strict;
use warnings;

open my $in, '<', 'in.txt' or die $!;

my %seen;
while(<$in>){
    chomp;
    my ($domain) = /[http:|https]\/\/(.+?)\//g;
    $seen{$domain}++;
    print "$_\n" if $seen{$domain} == 1;
}

答案 2 :(得分:0)

抱歉,我无法回复fugu帖子,

我认为问题可能是你在一行中有一个以上的URL,所以试试这个:

use strict;
use warnings;

open my $in, '<', 'in.txt' or die $!;

my %seen;
while(<$in>){
    chomp;
    for (split /\s/) {
      my ($url) = /[http:|https]\/\/(.+?)\//g;
      $seen{$url}++;
      print "$_\n" if $seen{$url} == 1;
    }
}

答案 3 :(得分:0)

如果您关心的是这些URI的域名,那么我建议您先将其过滤掉。

然后,这是一个简单的排序过程,并指定您只需要唯一的条目:

perl -lne 'print $1 if m{//(.+?)/}' file | sort | uniq > uniq_domains.txt