免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2256 | 回复: 5
打印 上一主题 下一主题

文件操作问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-20 13:50 |只看该作者 |倒序浏览
本帖最后由 超级细菌 于 2011-09-20 14:00 编辑

有下面格式的一个文件,由于在其中的第四列中有的没有编号,如果第六(五)列中有相同的姓名,那么就只保留第四列中有相应编号的那一行,把没有编号的那一行去掉。请高手指教一下,多谢!

Screenshot.png (18.84 KB, 下载次数: 20)

Screenshot.png

Screenshot-2.png (18.21 KB, 下载次数: 26)

Screenshot-2.png

论坛徽章:
0
2 [报告]
发表于 2011-09-20 14:26 |只看该作者
Unpack

--perldoc perlpacktut 第2个例子就解决你的问题...

论坛徽章:
0
3 [报告]
发表于 2011-09-25 09:24 |只看该作者
回复 2# Kitaisky


    你好,昨天看了一下那个perldoc,但是还是觉得没有看懂,还请您再详细指点一下,多谢!

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
4 [报告]
发表于 2011-09-25 15:30 |只看该作者
试试用正则表达式
  1. open F, 'file';
  2. my $f = do { local $/; <F> };

  3. print $1,"\n" while $f =~ /^(.*?\s+(?:\d{5})?\s+(.*?))$(?:.*?\2$)?/msg;
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-09-25 16:02 |只看该作者
本帖最后由 Perl_Er 于 2011-09-25 16:10 编辑

举个例子,其余的你自己写
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Data::Dumper;

  4. my @ary;
  5. my $count = 0;

  6. while(<DATA>){
  7.     print;
  8.     print "\n";
  9.    
  10.     @{$ary[$count++]} = unpack("A2 x2 A1 x2 A6 x2 A5 x2 A7 x2 A*");
  11. }

  12. print Dumper \@ary;

  13. __DATA__
  14. 13  1  345652         8131415  王泽
  15. 13  1  345652  58551  8131415  王泽宁
  16. 13  1  123454  89074  1234568  麻辣鸡丝
复制代码
13  1  345652         8131415  王泽

13  1  345652  58551  8131415  王泽宁

13  1  123454  89074  1234568  麻辣鸡丝
$VAR1 = [
          [
            '13',
            '1',
            '345652',
            '',
            '8131415',
            '王泽'
          ],
          [
            '13',
            '1',
            '345652',
            '58551',
            '8131415',
            '王泽宁'
          ],
          [
            '13',
            '1',
            '123454',
            '89074',
            '1234568',
            '麻辣鸡丝'
          ]
        ];

论坛徽章:
0
6 [报告]
发表于 2011-09-25 19:27 |只看该作者
使用第六列姓名或者第五列做主键,如果键不存在,就用每行内做做值;如果键存在,看看第4列是否存在,如果存在,也用行值做为值,否则就跳过。
my %hash;
while (<>) {
        chomp;
        my(undef,undef,undef,$id,undef,$name) = split "\t",$_;       
        if (exists $hash{$name}) {       
                if ($id =~ /\d+/) {                       
                        $hash{$name} = $_;
                }
        } else {
                $hash{$name} = $_;
        }
}

while (my($key,$value) = each %hash) {
   print "$hash{$key}\n";
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP