忽略与之前相同的下一个字段的行

时间:2009-09-22 17:36:49

标签: linux perl unix command

我的文件内容看起来像这样

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 个答案:

答案 0 :(得分:2)

TMTOWTDI:

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

编辑:第一行也可以用Randal L. Schwartz的诽谤代替:

my $str = do { local $/; <HANDLE> }; # 

答案 1 :(得分:1)

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; 

}

这很冗长,但我怀疑在一个非常大的文件中,性能可能比regexp更好。

答案 2 :(得分:0)

尝试使用uniq实用程序

uniq -w 3 your_file.txt

会做到这一点。不需要perl