- 论坛徽章:
- 307
|
本帖最后由 sunzhiguolu 于 2015-09-29 21:53 编辑
文本内容如下:
- Number start end name
- -------------------------------------------------------------
- NO.1 1 10 wf
- NO.1 11 22 wf
- NO.1 29 38 cz
- NO.1 39 51 cz
- NO.1 52 60 cz
- NO.2 2 9 gx
- NO.2 10 22 gx
- NO.2 23 40 gx
复制代码 希望根据 name 字段的取值去除重复行. 去重后 start 字段的起始值保持不变, end 字段保持最大值. 最终实现效果如下:
- Number start end name
- -------------------------------------------------------------
- NO.1 1 22 wf
- NO.1 29 60 cz
- NO.1 2 40 gx
复制代码#以下是一些变量的注释: (希望没有给您读代码造成困扰 ^_^)
#哈希变量 %record_list 保存最终结果, 数组 @record 存储每一条记录
#变量 $k, $next_number 分别存储 name, end 字段的值
- #!/usr/bin/perl
- use 5.010;
- use strict;
- use warnings;
- @ARGV or die "Give me a file!\n";
- my (%record_list, @record, $k, $next_number);
- while(<>){
- chomp;
- @record = split /\s+/;
- if (!%record_list){
- $record_list{$record[-1]} = \@record; #等号右面应改为 [@record];
- }else{
- ($next_number, $k) = ($record[-2], $record[-1]);
- if (exists $record_list{$k}){
- $record_list{$k}[-2] = $next_number;
- }else{
- $record_list{$k} = \@record; #这里同上
- }
- }
- }
- #结果测试:
- foreach my $key (keys %record_list){
- my ($id, $begin_num, $end_num, $name) = (
- $record_list{$key}[0],
- $record_list{$key}[1],
- $record_list{$key}[2],
- $record_list{$key}[3]);
- say "$id, $begin_num, $end_num, $name";
- }
复制代码 |
|