Игнорировать строки с такими же следующими полями, как и предыдущие - PullRequest
1 голос
/ 22 сентября 2009

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

123,1,ABC,DEF
123,1,ABC
345,4,TZY
456,3,XYZ
333,4,TTT,YYY
333,4,TTT

Я хочу игнорировать строки с прежним и следующим содержимым, то есть строки, содержащие 123 и 333

Вывод долженбыть

345,4,TZY
456,3,XYZ

Любые идеи о том, как это сделать

Ответы [ 3 ]

2 голосов
/ 22 сентября 2009

TMTOWTDI:

my $str = join '', <>;
$str =~ s/^(\d+).+\n(\1.+\n)+//mg;
print $str;

РЕДАКТИРОВАТЬ: первая строка также может быть заменена на бред Рэндала Л. Шварца:

my $str = do { local $/; <HANDLE> }; # 
1 голос
/ 23 сентября 2009

TMTOWDI

my $last_prefix = ""; 
my $last_line = ""; 
while (<>) { check_line($_); }
check_line("");    sub check_line {
    my $line = shift;
    my ($prefix) = ($line =~ /^([^,]*),/); 
    if (($prefix || "") ne $last_prefix ) {
        print $last_line;
        $last_line = $_;
    } else {
        $last_line = "";
    };
    $last_prefix = $prefix; 

}

Это многословно, но я подозреваю, что производительность может быть лучше, чем регулярное выражение для очень большого файла.

0 голосов
/ 22 сентября 2009

попробуйте утилиту uniq

uniq -w 3 your_file.txt

сделает трюк. нет необходимости в Perl

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