免费注册 查看新帖 |

Chinaunix

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

perl 继续提有关文件抽取列的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-22 17:32 |只看该作者 |倒序浏览
本帖最后由 aku1 于 2015-07-22 17:38 编辑

上次多谢各位把问题解决了,现在有另一个需求,比如第四列有很多个kernel-firmware,但是我只想抽取日期最新的一行打印,这行包括第l列,第2列和第3列,我用shell可以简单实现,用awk抓出第4列,然后sort 排序和去掉重复,写个循环,然后grep partten each line |tail -n1,就搞定。 用perl在怎么实现,大家帮忙,多谢!

20150905        RHSA-2014:1167-01        kernel-firmware-2.6.32-431.29.2.el6          kernel-firmware                2.6.32-431.1.2.el6.x86_64 <  2.6.32-431.29.2.el6
20150905        RHSA-2014:1167-01        kernel-headers-2.6.32-431.29.2.el6          kernel-headers                 2.6.32-431.1.2.el6.x86_64 <  2.6.32-431.29.2.el6
20150905        RHSA-2014:1167-01        perf-2.6.32-431.29.2.el6          perf                           2.6.32-358.el6       <  2.6.32-431.29.2.el6
20150925        RHSA-2014:1319-01        xerces-j2-2.7.1-12.7.el6_5          xerces-j2                      2.7.1-12.6.el6_0     <  2.7.1-12.7.el6_5
20151009        RHSA-2014:1552-02        openssh-5.3p1-104.el6          openssh                        5.3p1-94.el6         <  5.3p1-104.el6
20151009        RHSA-2014:1552-02        openssh-askpass-5.3p1-104.el6          openssh-askpass                5.3p1-94.el6         <  5.3p1-104.el6
20151009        RHSA-2014:1552-02        openssh-clients-5.3p1-104.el6          openssh-clients                5.3p1-94.el6         <  5.3p1-104.el6
20151009        RHSA-2014:1552-02        openssh-server-5.3p1-104.el6          openssh-server                 5.3p1-94.el6         <  5.3p1-104.el6
20151009        RHSA-2014:1388-02        cups-1.4.2-67.el6          cups                           1.4.2-48.el6_3.3     <  1.4.2-67.el6
20151009        RHSA-2014:1388-02        cups-libs-1.4.2-67.el6          cups-libs                      1.4.2-48.el6_3.3     <  1.4.2-67.el6
20151010        RHSA-2014:1620-01        java-1.7.0-openjdk-1.7.0.71-2.5.3.1.el6          java-1.7.0-openjdk             1.7.0.9-2.3.4.1.el6_3 <  1.7.0.71-2.5.3.1.el6
20151010        RHSA-2014:1620-01        java-1.7.0-openjdk-devel-1.7.0.71-2.5.3.1.el6          java-1.7.0-openjdk-devel       1.7.0.9-2.3.4.1.el6_3 <  1.7.0.71-2.5.3.1.el6
20151012        RHSA-2014:1655-01        libxml2-2.7.6-17.el6_6.1          libxml2                        2.7.6-8.el6_3.4      <  2.7.6-17.el6_6.1
20151012        RHSA-2014:1655-01        libxml2-devel-2.7.6-17.el6_6.1          libxml2-devel                  2.7.6-8.el6_3.4      <  2.7.6-17.el6_6.1
20151012        RHSA-2014:1655-01        libxml2-python-2.7.6-17.el6_6.1          libxml2-python                 2.7.6-8.el6_3.4      <  2.7.6-17.el6_6.1
20151114        RHSA-2014:1873-01        libvirt-0.10.2-46.el6_6.2          libvirt                        0.10.2-18.el6        <  0.10.2-46.el6_6.2
20151114        RHSA-2014:1873-01        libvirt-client-0.10.2-46.el6_6.2          libvirt-client                 0.10.2-18.el6        <  0.10.2-46.el6_6.2
20151114        RHSA-2014:1873-01        libvirt-devel-0.10.2-46.el6_6.2          libvirt-devel                  0.10.2-18.el6        <  0.10.2-46.el6_6.2
20151114        RHSA-2014:1873-01        libvirt-python-0.10.2-46.el6_6.2          libvirt-python                 0.10.2-18.el6        <  0.10.2-46.el6_6.2
20151212        RHSA-2014:1999-01        mailx-12.4-8.el6_6          mailx                          12.4-6.el6           <  12.4-8.el6_6
20151212        RHSA-2014:1997-01        kernel-2.6.32-504.3.3.el6          kernel                         2.6.32-431.1.2.el6.x86_64 <  2.6.32-504.3.3.el6
20151212        RHSA-2014:1997-01        kernel-firmware-2.6.32-504.3.3.el6          kernel-firmware                2.6.32-431.1.2.el6.x86_64 <  2.6.32-504.3.3.el6
20151212        RHSA-2014:1997-01        kernel-headers-2.6.32-504.3.3.el6          kernel-headers                 2.6.32-431.1.2.el6.x86_64 <  2.6.32-504.3.3.el6
20151212        RHSA-2014:1997-01        perf-2.6.32-504.3.3.el6          perf                           2.6.32-358.el6       <  2.6.32-504.3.3.el6
20160117        RHSA-2015:0066-01        openssl-1.0.1e-30.el6_6.5          openssl                        1.0.1e-16.el6_5.7    <  1.0.1e-30.el6_6.5
20160117        RHSA-2015:0066-01        openssl-devel-1.0.1e-30.el6_6.5          openssl-devel                  1.0.1e-16.el6_5.7    <  1.0.1e-30.el6_6.5
20160123        RHSA-2015:0087-01        kernel-2.6.32-504.8.1.el6          kernel                         2.6.32-431.1.2.el6.x86_64 <  2.6.32-504.8.1.el6
20160123        RHSA-2015:0087-01        kernel-firmware-2.6.32-504.8.1.el6          kernel-firmware                2.6.32-431.1.2.el6.x86_64 <  2.6.32-504.8.1.el6
20160123        RHSA-2015:0087-01        kernel-headers-2.6.32-504.8.1.el6          kernel-headers                 2.6.32-431.1.2.el6.x86_64 <  2.6.32-504.8.1.el6
20160123        RHSA-2015:0087-01        perf-2.6.32-504.8.1.el6          perf                           2.6.32-358.el6       <  2.6.32-504.8.1.el6
20160206        RHSA-2015:0165-01        subversion-1.6.11-12.el6_6          subversion                     1.6.11-10.el6_5      <  1.6.11-12.el6_6
20160206        RHSA-2015:0165-01        subversion-javahl-1.6.11-12.el6_6          subversion-javahl              1.6.11-10.el6_5      <  1.6.11-12.el6_6
20160305        RHSA-2015:0672-01        bind-libs-9.8.2-0.30.rc1.el6_6.2          bind-libs                      9.8.2-0.30.rc1.el6_6.1 <  9.8.2-0.30.rc1.el6_6.2
20160305        RHSA-2015:0672-01        bind-utils-9.8.2-0.30.rc1.el6_6.2          bind-utils                     9.8.2-0.30.rc1.el6_6.1 <  9.8.2-0.30.rc1.el6_6.2
20160306        RHSA-2015:0674-01        kernel-2.6.32-504.12.2.el6          kernel                         2.6.32-431.1.2.el6.x86_64 <  2.6.32-504.12.2.el6
20160306        RHSA-2015:0674-01        kernel-firmware-2.6.32-504.12.2.el6          kernel-firmware                2.6.32-431.1.2.el6.x86_64 <  2.6.32-504.12.2.el6
20160306        RHSA-2015:0674-01        kernel-headers-2.6.32-504.12.2.el6          kernel-headers                 2.6.32-431.1.2.el6.x86_64 <  2.6.32-504.12.2.el6
20160306        RHSA-2015:0674-01        perf-2.6.32-504.12.2.el6          perf                           2.6.32-358.el6       <  2.6.32-504.12.2.el6
20160320        RHSA-2015:0715-01        openssl-1.0.1e-30.el6_6.7          openssl                        1.0.1e-16.el6_5.7    <  1.0.1e-30.el6_6.7
20160320        RHSA-2015:0715-01        openssl-devel-1.0.1e-30.el6_6.7          openssl-devel                  1.0.1e-16.el6_5.7    <  1.0.1e-30.el6_6.7
20160407        RHSA-2015:0797-01        xorg-x11-server-Xorg-1.15.0-26.el6_6          xorg-x11-server-Xorg           1.13.0-23.1.el6_5    <  1.15.0-26.el6_6
20160407        RHSA-2015:0797-01        xorg-x11-server-common-1.15.0-26.el6_6          xorg-x11-server-common         1.13.0-23.1.el6_5    <  1.15.0-26.el6_6

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-07-22 18:59 |只看该作者
本帖最后由 MMMIX 于 2015-07-22 18:59 编辑

回复 1# aku1


    用个 hash 保存需要的结果即可:

  1. my %r;
  2. while (<>) {
  3.     chomp;
  4.     my @f = split;
  5.     if (!(defined $r{$f[3]}) || $r{$f[3]}->[0] < $f[0]) {
  6.         $r{$f[3]} = [ @f[0..2] ];
  7.     }
  8. }

  9. while (my ($k, $v) = each %r) {
  10.     say "@$v";
  11. }
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2015-07-22 19:22 |只看该作者
回复 1# aku1

What You Want Is What You Code(WYWIWYC)

>> ...比如第四列有很多个kernel-firmware...,想抽取日期最新的一行打印,这行包括第l列,第2列和第3列

1. one-line awk code
$ awk 'd<$1&&$4~/kernel-firmware/{NF=3;s=$0;d=$1}END{print s}' FILE20160306 RHSA-2015:0674-01 kernel-firmware-2.6.32-504.12.2.el6

2. one-line perl code
$ perl -lane '{if(d<$F[0]&&$F[3]=~m/kernel-firmware/){$#F=2;$s="@F";$d=$F[0]}}END{print $s}' FILE
20160306 RHSA-2015:0674-01 kernel-firmware-2.6.32-504.12.2.el6

3. perl code in a file
$ perl get_kernel-firmware.pl FILE
20160306 RHSA-2015:0674-01 kernel-firmware-2.6.32-504.12.2.el6

$ cat get_kernel-firmware.pl
use strict;
use warnings;

my $sDate = 0;
my $sKernel = "";
while(<>){
  my @aItem = split;

  if($sDate < $aItem[0] && $aItem[3] =~ m/kernel-firmware/){
    $#aItem = 2;
    $sKernel = "@aItem";
    $sDate = $aItem[0];
  }
}
print "$sKernel\n";


   

论坛徽章:
0
4 [报告]
发表于 2015-07-23 07:53 |只看该作者
多谢两位,看样子还是没经常写

论坛徽章:
0
5 [报告]
发表于 2015-07-23 08:55 |只看该作者
回复 2# MMMIX


    不错!

论坛徽章:
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
6 [报告]
发表于 2016-09-11 22:16 |只看该作者
  1. perl -anle '{@a=@F[0..2] if($F[3] eq "kernel-firmware" and (!@a or $a[0]<$F[0]))}END{print "@a"}' f
复制代码

论坛徽章:
0
7 [报告]
发表于 2016-09-17 23:27 |只看该作者
本帖最后由 华小飞_Perl 于 2016-09-17 23:29 编辑

写了一个~
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;

  4. my @new_kernel;
  5. while (<>) {
  6.         chomp;
  7.         if (/.*?\s+kernel\-firmware\s+.*/) {
  8.                 push @new_kernel, $_;
  9.         }
  10. }
  11. my %new_kernel = map { $_ =~ /^(\d+)(.*)$/m ? ($1 => $2) : exit; } @new_kernel;
  12. my @sort = reverse sort { $a <=> $b } keys %new_kernel;
  13. my $most = shift @sort;
  14. print $most, $new_kernel{$most}, "\n";
复制代码


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP