Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1171807
  • 博文数量: 312
  • 博客积分: 12522
  • 博客等级: 上将
  • 技术积分: 3376
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 18:35
文章分类

全部博文(312)

文章存档

2016年(3)

2015年(1)

2013年(1)

2012年(28)

2011年(101)

2010年(72)

2009年(13)

2008年(93)

分类: Python/Ruby

2011-11-18 16:36:42

问题:
1楼 发表于 2009-11-22 20:19 

各位Perl 老大

看下面的文本

pool name:    None
pool name:    NetBackup
pool name:    DataStore
pool name:    CatalogBackup
pool name:    DCCBJ_PTL_EBK_COR


很弱的一个问题,(我在windows环境,所以想用 Perl)如何用Perl实现,我可以得到第二列的值 ?


 None
 NetBackup
 DataStore
 CatalogBackup
 DCCBJ_PTL_EBK_COR

多谢了?
回答:

给你一个通用的命令程序,

[liuguiyou@localhost ~]$ cat a.txt
pool name:    None
pool name:    NetBackup
pool name:    DataStore
pool name:    CatalogBackup
pool name:    DCCBJ_PTL_EBK_COR

[liuguiyou@localhost perl]$ cat tiqu_lie.pl
#!/usr/bin/perl
#提取某些列,增加表头,按照条件输出
use warnings;
use strict;


open(INFILE, "/home/liuguiyou/a.txt");
open(OUTFILE, ">/home/liuguiyou/b.txt") ||   die "Cannot open the newfile: $!\n";

my @a;

while () {
      chomp;
        
        @a = split;
        print OUTFILE "$a[2]\n";
}
exit;
[liuguiyou@localhost ~]$ cat b.txt
None
NetBackup
DataStore
CatalogBackup
DCCBJ_PTL_EBK_COR

b.txt就是你想要的!

回答


#!/usr/bin/perl
while(){
    print for (split)[2],"\n";   #"for" can be replaeced by "foreach";
}
__DATA__
pool name:    None
pool name:    NetBackup
pool name:    DataStore
pool name:    CatalogBackup
个人感觉这样更好点,输出的结果为:
None
NetBackup
DataStore
CatalogBackup

__DATA__表示的是__DATA__下面的那些数据,另外print for (split)[2];是高手们的一种写法,意思是:输入DATA的每一行,以空格分割,得到一个数组,打印出数组的第2个元素,省略掉的都是默认变量$_
如果提取1列和2列,只需要将 (split)[2],改为 (split)[1,2],即可。
说明:有网友建议把
print for (split)[2],"\n";中的for去掉,是多余的,直接改为print + (split)[2],"\n",自己把上边的改为:
#!/usr/bin/perl
use warnings;
use strict;

while(){
    print STDOUT (split)[2],"\n";
}
__DATA__
pool name:    None
pool name:    NetBackup
pool name:    DataStore
pool name:    CatalogBackup
也没有出现错误,等高手来解释这个问题吧



仙子回答:
像这种格式比较固定的,用regex或split都可以。命令行

# perl -e '
my $str=<pool name:    None
pool name:    NetBackup
pool name:    DataStore
pool name:    CatalogBackup
pool name:    DCCBJ_PTL_EBK_COR
EOF
open my $fd,"<",\$str;
while(<$fd>) {
    print $1,"\n" if /^pool name:\s+(.+)$/
}
'
None
NetBackup
DataStore
CatalogBackup
DCCBJ_PTL_EBK_COR
 
阅读(2555) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~