免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Jason_0316
打印 上一主题 下一主题

[文本处理] Shell 脚本编写 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
11 [报告]
发表于 2016-06-02 13:46 |只看该作者
本帖最后由 sunzhiguolu 于 2016-06-02 13:46 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @aData = (-1, -1, undef);

  5. while (<>){
  6.     my ($c1, $c2, $c3) = split;
  7.     my ($v) = $c1 =~ /\d+/g;
  8.     $aData[-1] ||= $c3;
  9.     if ($aData[-1] eq $c3){
  10.         @aData[0, 1, -1] = ($v, $c2, $c3) if ($aData[0] <= $v);
  11.         next;
  12.     }
  13.     print "@aData\n";
  14.     @aData = ();
  15.     @aData[0, 1, 2] = ($v, $c2, $c3);
  16. }
  17. print "@aData\n";
复制代码
perl abc.pl abc
------------------------------------------
4 498048 00:08:30
10 420104 00:08:31
12 420104 00:08:32

论坛徽章:
0
12 [报告]
发表于 2016-06-02 13:48 |只看该作者
回复 8# haooooaaa


awk -vs="000829" -ve="000833" -F'[ :]+' '{m=+($3$4$5)}m>+s && m<+e{f=+substr($1,3);g=$3":"$4":"$5;if(a[g]<=f){a[g]=f;b[g]=$2}}END{for(i in a)print a,b,i}'  a.txt
4-GID0 498048 00:08:30
9-GID0 420104 00:08:31
9-GID0 420104 00:08:32

应输出
4-GID0 498048 00:08:30
10-GID0 420104 00:08:31
12-GID0 420104 00:08:32

论坛徽章:
0
13 [报告]
发表于 2016-06-02 13:51 |只看该作者
回复 8# haooooaaa


awk -vs="000829" -ve="000833" -F'[ :]+' '{m=+($3$4$5)}m>+s && m<+e{f=+substr($1,3);g=$3":"$4":"$5;if(a[g]<=f){a[g]=f;b[g]=$2}}END{for(i in a)print a,b,i}'  a.txt
4-GID0 498048 00:08:30
9-GID0 420104 00:08:31
9-GID0 420104 00:08:32
-应输出
4-GID0 498048 00:08:30
10-GID0 420104 00:08:31
12-GID0 420104 00:08:32

论坛徽章:
0
14 [报告]
发表于 2016-06-02 13:59 |只看该作者
回复 11# sunzhiguolu


大师给力啊,运行结果正确,不过我对perl不熟悉,学习啦!谢谢!

论坛徽章:
0
15 [报告]
发表于 2016-06-02 14:06 |只看该作者
回复 11# sunzhiguolu


大师,如果我加上起始和结束时间段读取源文件,脚本怎么修改下吗?

比如 这个文件一天内时间,只取某一段时间的。

谢谢!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
16 [报告]
发表于 2016-06-02 14:15 |只看该作者
回复 15# Jason_0316
试下,
perl abc.pl abc
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @aData = (-1, -1, undef);
  5. my $regx = qr /(?<=\d)(?=(?:\d\d)+\z)/;

  6. print "Enter begin time:";
  7. chomp (my $bt = <STDIN>);
  8. print "Enter end time:";
  9. chomp (my $et = <STDIN>);

  10. $bt =~ s/$regx/:/g;
  11. $et =~ s/$regx/:/g;

  12. while (<>){
  13.     my ($c1, $c2, $c3) = split;
  14.     if ($c3 gt $bt and $c3 lt $et){
  15.         my ($v) = $c1 =~ /\d+/g;
  16.         $aData[-1] ||= $c3;
  17.         if ($aData[-1] eq $c3){
  18.             @aData[0, 1, -1] = ($v, $c2, $c3) if ($aData[0] <= $v);
  19.             next;
  20.         }
  21.         print "@aData\n";
  22.         @aData = ();
  23.         @aData[0, 1, 2] = ($v, $c2, $c3);
  24.     }
  25. }
  26. print "@aData\n";
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
17 [报告]
发表于 2016-06-02 14:16 |只看该作者
本帖最后由 sunzhiguolu 于 2016-06-02 14:21 编辑

你再验证下, (输入的时间需要完整输入, 如: 000120 而不能 00120)

perl abc.pl abc
Enter begin time:000830
Enter end time:000832
-----------------------------------------------
10 420104 00:08:31

perl abc.pl abc
Enter begin time:000830
Enter end time:000833
-----------------------------------------------
10 420104 00:08:31
12 420104 00:08:32

求职 : 技术支持/维
论坛徽章:
0
18 [报告]
发表于 2016-06-02 14:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
19 [报告]
发表于 2016-06-02 14:47 |只看该作者
回复 17# sunzhiguolu


    大师,我验证了下,输入时间000829 和 00:08:29 都可以,另外时间输入,可以这样写:perl abc.per abc.txt 00:08:29 00:08:35 ? 这样可以写到命令行脚本了!


    非常感谢,谢谢!

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
20 [报告]
发表于 2016-06-02 15:03 |只看该作者
本帖最后由 sunzhiguolu 于 2016-06-02 16:31 编辑

回复 19# Jason_0316
再试下,
perl abc.pl abc 000830 000833

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

my @aData = (-1, -1, undef);
my $regx = qr /(?<=\d)(?=(?:\d\d)+\z)/;

my ($bt, $et) = splice (@ARGV, 1);
s/$regx/:/g for ($bt, $et);

while (<>){
    my ($c1, $c2, $c3) = split;
    if ($c3 gt $bt and $c3 lt $et){
        my ($v) = $c1 =~ /\d+/g;
        $aData[-1] ||= $c3;
        if ($aData[-1] eq $c3){
            @aData[0, 1, -1] = ($v, $c2, $c3) if ($aData[0] <= $v);
            next;
        }
        print "@aData\n";
        @aData[0, 1, -1] = ($v, $c2, $c3);
    }
}
print "@aData\n";


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP