如果模式在perl中匹配,则从文件中读取行并跳到下一行

时间:2014-01-23 09:25:13

标签: perl

我正在尝试从文件中读取行并将输出写入另一个文件。我正在使用open来实现这一目标。但我无法清除第一个文件中的一些不需要的行。 这是问题所在:

我有一个包含以下行的文本文件

Project1_Employees
Matt Stone
Trey parker
Eric Cartman
Kenny

Project2_Employees
Stan
Matt Stone
Trey Parker
Kyle

我正在使用我的代码对名称进行排序并打印uniq名称。但是我无法删除Project1_Employees和Project2_Employees。这只是文本文件的一部分。有数百条这样的线。

open(FH, '<employeenames.txt');
next if (<FH> =~ m/Employees/);
open(OFH, ">sortedemployee.txt");
my %seen;
print OFH sort grep !$seen{$_}++, <FH>;
close(OFH);
close(FH); 

我正在寻找的输出是

Eric Cartman
Kenny
Kyle
Matt Stone
Stan
Trey parker

我想使用open这样做,因为我有一个要求。

3 个答案:

答案 0 :(得分:1)

open(FH,  '<', 'employeenames.txt') or die $!;
open(OFH, '>', "sortedemployee.txt") or die $!;
my %seen;
print OFH sort grep { !$seen{$_}++ and !/Employees/ } <FH>;

答案 1 :(得分:0)

希望此代码可以帮助您更轻松地理解此过程。

#!/usr/bin/perl
use utf8;
use strict;
use warnings;

sub write_special_line {
    open my $file_handler, '<', 'test_file' or die;
    open my $new_handler, '>', 'write_test' or die;
    my $sign;
    my ($hash, @names);
    while (my $row = <$file_handler>) {
        if ($row =~ /Project\d+_Employees/) {
            next;
        } else {
            $hash->{$row} += 1;
            if ($hash->{$row} <= 1) {
                push @names, $row;
            }
        }
    }
    close $file_handler;
    my @sorted = sort {lc($a) cmp lc($b)} @names;
    for my $name (@sorted) {
        print $new_handler $name;
    }
    close $new_handler;
}

write_special_line();

答案 2 :(得分:0)

已经有一些好的perl答案了,但是如果你不只是在考虑你的perl,我就不会仅使用perl进行简单的文件操作。使用像gnu grep这样的东西,例如

$ grep -v '_Employees\|^$' employeenames.txt | sort -f | uniq -i > sortedemployee.txt
$ cat sortedemployee.txt
Eric Cartman
Kenny
Kyle
Matt Stone
Stan
Trey parker