我正在尝试从文件中读取行并将输出写入另一个文件。我正在使用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这样做,因为我有一个要求。
答案 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