ドメインとサブドメインを一緒にソートしてグループ化するより良い方法はありますか?たとえば、list
次を含むファイル
morefu.sub1.foo.com
www.foo.com
bar.foo.com
sub1.foo.com
fufu.isub1.foo.com
foofoo.bar.foo.com
morefoo.bar.foo.com
fufu.sub1.foo.com
使用
for i in $(grep -oP '(\w+).foo.com' list | sort | uniq); do grep $i list | sort; echo; done
ほとんど動作します。
bar.foo.com
foofoo.bar.foo.com
lotsmorefubar.bar.foo.com
morefoo.bar.foo.com
fufu.isub1.foo.com <-- should not be here
fufu.sub1.foo.com
morefu.sub1.foo.com
sub1.foo.com
www.foo.com
しかし、fufu.isub1.foo.com
それ自体がセクションになければなりません。 grep式に^
andを追加しても\b
役に立ちません。
これを行うより正確で効率的な方法があるかどうか疑問に思いますか?
ベストアンサー1
どうですか?
tr -d [:blank:] < hosts | # remove trailing whitespace
perl -lne 'print join ".", reverse(split /\./)' | # reverse order of fields
sort | # sort
awk -F. '
!seen[$1.$2.$3]++ && NR>1 {print ""} # insert blank line when tld,dom,sub change
{for (i=NF;i>1;i--) printf "%s.", $i; print $1} # print fields in original order
'
与える
bar.foo.com
foofoo.bar.foo.com
morefoo.bar.foo.com
fufu.isub1.foo.com
sub1.foo.com
fufu.sub1.foo.com
morefu.sub1.foo.com
www.foo.com
同じアルゴリズムを使用してより良い実装を望んでいます。ハッシュ値のハッシュ値パールでは:
#!/usr/bin/perl
use strict;
use warnings;
my %domains = ();
while (defined($_ = <ARGV>)) {
chomp $_ ;
$_ =~ s/\s+//;
my @F = reverse(split(/\./));
my $domain = join(".", @F[0..2]);
if ( ! exists($domains{$domain}) ) {
$domains{$domain} = {};
}
$domains{$domain}{join(".", @F)}++;
}
foreach my $domain (sort keys %domains) {
foreach my $host (sort keys %{ $domains{$domain} }) {
print join(".", reverse(split(/\./, $host))), "\n";
}
print "\n"
}