2010-11-24 11 views
1

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?

感謝:)

答えて

1

を私はあなたの問題で挑戦してきたので、私はあなたにスクリプトを書きました。あなたがそれを好きだと思います。 :)

#!/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__ 

これはまさにあなたが必要とするものです。それはちょっと混乱している場合はごめんなさい。

sort -t '#' -k 2 -u inputfile 
:あなたが唯一の一意の値を表示したい場合は

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

sort -t '#' -k 2 inputfile 

このグループにそれらを部分によって#文字の後に:

+0

あまりにも多くの問題は、ライン1781ので、行の終わりをチェックする必要があります:##。テスト 行1782:##テストリーダーボード 行1787:##。abc 行1788:##。abcng since ##。adcは##と同じではありませんabcng – user349418

+0

@ user349418が編集されました。もう一度やり直してください。 – Ruel

1

この

が動作しているようです

結果:

##.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

'sort 'の最初の例で誤字があると思います。 'sort -t '#' -k 2 inputfile'(-uなし)と入力することは可能でしょうか? – martineno

+0

@martineno:はい、ありがとう。 –

0

ここではそれを行うための一つの方法です、必要に応じて複数のファイルに拡張するのはかなり簡単です。このファイル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

これを試してみましたが、行末を確認しません。たとえば、 行10476:test.com ### plf-ysm 行10477:test.com ### plf-ysm-side Arent the same。そうでなければ、適切なスクリプト:) – user349418

+0

@ user349418 => 'test.com ### plf-ysm'は' test.com ### plf-ysm-side'の中に含まれ、あなたが与えたテストデータに従ってマッチします。私はおそらくあなたが持っている問題を修正する編集を行ったが、次回は、より多くのテストデータを提供してください。また、あなたの質問に対する回答がまともではないと思うなら、クリックすると上に矢印があります。 –

関連する問題