Обнаружение дублирующих линий - PullRequest
1 голос
/ 24 ноября 2010

У меня есть файл с элементами CSS, и я пытаюсь проверить наличие дублирующих элементов CSS, .. затем вывести строки, которые показывают двойные линии.

    ###Test
    ###ABC
    ###test
    ##.hello
    ##.ABC
    ##.test
    bob.com###Test
    ~qwerty.com###Test
    ~more.com##.ABC

###Test& ##.ABC уже существует в списке, и мне нужен способ вывода строк, которые используются в файле, в основном проверка на дублирование (с учетом регистра).Таким образом, используя приведенный выше список, я бы сгенерировал что-то вроде этого ..

    Line 1: ###Test
    Line 7: bob.com###Test
    Line 8: ~qwerty.com###Test

    Line 5: ##.ABC
    Line 9: ~more.com##.ABC

Что-то в bash или, может быть, perl?

Спасибо :))

Ответы [ 4 ]

1 голос
/ 24 ноября 2010

Мне бросили вызов ваша проблема, поэтому я написал вам сценарий.Надеюсь, вам понравилось.:)

#!/usr/bin/perl

use strict;
use warnings;

sub loadf($);

{
    my @file = loadf("style.css");
    my @inner = @file;
    my $l0 = 0; my $l1 = 0; my $l2 = 0; my $dc = 0; my $tc;
    foreach my $line (@file) {
        $l1++;
        $line =~ s/^\s+//;
        $line =~ s/\s+$//;
        foreach my $iline (@inner) {
            $l2++;
            $iline =~ s/^\s+//;
            $iline =~ s/\s+$//;
            next if ($iline eq $line);
            if ($iline =~ /\b$line\b/) {
                $dc++;
                if ($dc > 0) {
                    if ($l0 == 0) {
                        print "Line " . $l1 . ": " . $line . "\n";
                        $l0++;
                    }
                    print "Line " . $l2 . ": " . $iline . "\n";
                }
            }
        }
        print "\n" unless($dc == 0);
        $dc = 0; $l0 = 0; $l2 = 0;
    }
}

sub loadf($) {
    my @file = ( );
    open(FILE, $_[0] . "\n") or die("Couldn't Open " . $_[0] . "\n");
    @file = <FILE>;
    close(FILE);
    return @file;
}

__END__

Это именно то, что вам нужно.И извините, если это немного грязно.

1 голос
/ 24 ноября 2010

Это похоже на работу:

sort -t '#' -k 2 inputfile

Группирует их по части после символов #:

##.ABC
~more.com##.ABC
###ABC
##.hello
##.test
###test
bob.com###Test
~qwerty.com###Test
###Test

Если вы хотите видеть только уникальные значения:

sort -t '#' -k 2 -u inputfile

Результат:

##.ABC
###ABC
##.hello
##.test
###test
###Test

Это довольно близко дублирует пример выходных данных в вопросе (он опирается на некоторые, возможно, специфичные для GNU функции):

cat -n inputfile | 
  sed 's/^ *\([0-9]\)/Line \1:/' |
  sort -t '#' -k 2 |
  awk -F '#+' '{if (! seen[$2]) { \
      if ( count > 1) printf "%s\n", lines; \
      count = 0; \
      lines = "" \
    }; \
    seen[$2] = 1; \
    lines = lines "\n" $0; ++count}
    END {if (count > 1) print lines}'

Результат:

Line 5: ##.ABC
Line 9: ~more.com##.ABC

Line 1: ###Test
Line 7: bob.com###Test
Line 8: ~qwerty.com###Test
0 голосов
/ 24 ноября 2010

Вот один из способов сделать это, который довольно легко расширить на несколько файлов, если это необходимо.

С этим файлом find_dups.pl:

use warnings;
use strict;

my @lines;
while (<>) {                                     # read input lines
    s/^\s+//; s/\s+$//;                          # trim whitespace
    push @lines, {data => $_, line => $.} if $_  # store useful data
}

@lines = sort {length $$a{data} <=> length $$b{data}} @lines; # shortest first 

while (@lines) {
    my ($line, @found) = shift @lines;
    my $re = qr/\Q$$line{data}\E$/;              # search token 
    @lines = grep {                              # extract matches from @lines
        not $$_{data} =~ $re && push @found, $_
    } @lines;
    if (@found) {                                # write the report
        print "line $$_{line}: $$_{data}\n" for $line, @found;
        print "\n";
    }
}

затем perl find_dups.pl input.cssотпечатки:

line 5: ##.ABC
line 9: ~more.com##.ABC

line 1: ###Test
line 7: bob.com###Test
line 8: ~qwerty.com###Test
0 голосов
/ 24 ноября 2010

Я бы рекомендовал использовать функцию uniq, если вы можете установить MoreUtils:

как-д-я-печать уникальные-элементы в жемчужно-массиве

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...