【发布时间】:2010-11-30 11:53:42
【问题描述】:
我有一个文件内容,看起来像这样
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
关于如何解决这个问题的任何想法
【问题讨论】:
我有一个文件内容,看起来像这样
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
关于如何解决这个问题的任何想法
【问题讨论】:
试试 uniq 实用程序
uniq -w 3 your_file.txt
会成功的。不需要perl
【讨论】:
TMTOWTDI:
my $str = join '', <>;
$str =~ s/^(\d+).+\n(\1.+\n)+//mg;
print $str;
编辑:第一行也可以替换为 Randal L. Schwartz 的 slurp:
my $str = do { local $/; <HANDLE> }; #
【讨论】:
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;
}
这很罗嗦,但我怀疑在非常大的文件上性能可能比正则表达式更好。
【讨论】: