2015-10-19 1 views
0

Привет У меня есть текстовый файл, который нужно разобратьразобрать текстовый файл судится регулярных выражений в Perl

libA/cellA/view1/data.dm#1 - edit default 
libA/cellA/view1/master.tag#1 - edit defau 
libA/cellA/view1/sch.oa#1 - edit default c 
libA/cellA/view1/thumbnail_128x128.png#1 - 
libA/cellB/view1/data.dm#1 - edit default 
libA/cellB/view1/master.tag#1 - edit defau 
libA/cellB/view1/sch.oa#1 - edit default c 
libA/cellB/view1/thumbnail_128x128.png#1 - 
libA/cellB/symbol/master.tag#1 - edit defa 
libA/cellB/symbol/symbol.oa#1 - edit defau 
libA/cellB/symbol/thumbnail_128x128.png#1 
libA/cellC/view1/data.dm#1 - edit default 
libA/cellC/view1/master.tag#1 - edit defau 
libA/cellC/view1/sch.oa#1 - edit default c 
libA/cellC/view1/thumbnail_128x128.png#1 - 
libA/cellD/veriloga/data.dm#1 - edit defau 
libA/cellD/veriloga/master.tag#1 - edit de 
libA/cellD/veriloga/netlist.oa#1 - edit de 
libA/cellD/veriloga/veriloga.va#1 - edit d 
libA/cellE/view1/data.dm#1 - edit default 
libA/cellE/view1/master.tag#1 - edit defau 

Шаг1: В выше текстового файла я только хочу, чтобы сохранить текст до третьего вхождение в символ «/». например, выход должен быть, как показано ниже:

libA/cellA/view1 
libA/cellA/view1 
libA/cellA/view1 
libA/cellA/view1 
libA/cellB/view1 
libA/cellB/view1 
libA/cellB/view1 
libA/cellB/view1 
libA/cellB/view2 
libA/cellB/view2 
libA/cellB/view2 
libA/cellC/view1 
libA/cellC/view1 
libA/cellC/view1 
libA/cellC/view1 
libA/cellD/view3 
libA/cellD/view3 
libA/cellD/view3 
libA/cellD/view3 
libA/cellE/view1 
libA/cellE/view1 

Setp2: Тогда я хотел бы, чтобы удалить повторяющиеся строки сохранить пустую строку между ними:

libA/cellA/view1 



libA/cellB/view1 



libA/cellB/view2 


libA/cellC/view1 


libA/cellD/view3 




libA/cellE/view1 

любой указатель на то, как сделать это в Perl? я что-то вроде этого пытается:

#!/usr/bin/perl 
# File: parse.pl 

unless (open(MYFILE, "sample.txt")) 
{ 
    die ("cannot open input file file1\n"); 
} 

unless (open(OUTFILE, ">outfile.txt")) 
{ 
    die ("cannot open output file outfile\n"); 
} 


# if the program gets this far, the file was 
# opened successfully 
$line = <MYFILE>; 
while ($line ne "") 
{ 
    #print ($line); 

my ($lib, $cell, $view) = split /:/, $line; 
#print "$lib\n"; 
#print "$cell\n"; 
#print "$view\n"; 
print OUTFILE ($lib/$cell/$view/n); 
    $line = <MYFILE>; 

} 
+0

Вы хотите 'split' и хэш, а не регулярное выражение. что ты уже испробовал? –

+0

Не могу ли я использовать регулярное выражение и ничего не заменить после появления третьего символа '/'? – sanforyou

+0

Вы можете, но не должны. Это не просто '/' --- это тоже все, что находится между косами, которые вы хотите сохранить. Кроме того, ваш пример вывода даже правильный? Похоже, что для 'libA/cellC/view1' все еще существуют повторяющиеся строки. –

ответ

1

Сохранить как script.pl (или любой другой) и вызывать так: perl script.pl input.txt

use strict; 
use warnings; 

my %unique; 

while (<>) { 
    my @parts = split(/\//, $_); 
    my $key = join('/', @parts[0 .. 2]); 

    if (!$unique{$key}++) { 
     print $key; 
    } 

    print "\n"; 
} 
+0

Может быть, поп-части, поэтому он справляется с разными путями. – Sobrique

0

Это что-то вроде этого

Код:

my %unique =(); 
my @fields = undef; 
while(<DATA>){ 
    chomp; 
    @fields = split /\//, $_; 
    if (not $unique{"$fields[0]/$fields[1]/$fields[2]"}++){ 
     print "$fields[0]/$fields[1]/$fields[2]" 
    }else{ 
     print "\n"; 
    } 
} 
#map {print $_."\n"} keys %unique; 

__DATA__ 
libA/cellA/view1/data.dm#1 - edit default 
libA/cellA/view1/master.tag#1 - edit defau 
libA/cellA/view1/sch.oa#1 - edit default c 
libA/cellA/view1/thumbnail_128x128.png#1 - 
libA/cellB/view1/data.dm#1 - edit default 
libA/cellB/view1/master.tag#1 - edit defau 
libA/cellB/view1/sch.oa#1 - edit default c 
libA/cellB/view1/thumbnail_128x128.png#1 - 
libA/cellB/symbol/master.tag#1 - edit defa 
libA/cellB/symbol/symbol.oa#1 - edit defau 
libA/cellB/symbol/thumbnail_128x128.png#1 
libA/cellC/view1/data.dm#1 - edit default 
libA/cellC/view1/master.tag#1 - edit defau 
libA/cellC/view1/sch.oa#1 - edit default c 
libA/cellC/view1/thumbnail_128x128.png#1 - 
libA/cellD/veriloga/data.dm#1 - edit defau 
libA/cellD/veriloga/master.tag#1 - edit de 
libA/cellD/veriloga/netlist.oa#1 - edit de 
libA/cellD/veriloga/veriloga.va#1 - edit d 
libA/cellE/view1/data.dm#1 - edit default 
libA/cellE/view1/master.tag#1 - edit defau 

Выход:

libA/cellA/view1 


libA/cellB/view1 


libA/cellB/symbol 

libA/cellC/view1 


libA/cellD/veriloga 


libA/cellE/view1 
Смежные вопросы