我的文件内容看起来像这样
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
关于如何解决这个问题的任何想法
答案 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