【问题标题】:perl select specific column and store to different arraysperl 选择特定列并存储到不同的数组
【发布时间】:2013-12-15 05:29:12
【问题描述】:

有一个数据:

set interfaces ge-1/0/2 unit 101 family inet address 10.187.132.3/27 vrrp-group 1 virtual-address 10.187.132.1
set interfaces ge-1/0/2 unit 102 family inet address 10.187.132.35/27 vrrp-group 2 virtual-address 10.187.132.33
set interfaces ge-1/0/2 unit 103 family inet address 10.187.132.67/27 vrrp-group 3 virtual-address 10.187.132.65
set interfaces ge-1/0/2 unit 104 family inet address 10.187.132.99/27 vrrp-group 4 virtual-address 10.187.132.97
set interfaces ge-1/0/2 unit 105 family inet address 10.187.132.131/27 vrrp-group 5 virtual-address 10.187.132.129
set interfaces ge-1/0/2 unit 106 family inet address 10.187.132.163/27 vrrp-group 6 virtual-address 10.187.132.161
set interfaces ge-1/0/2 unit 107 family inet address 10.187.132.195/27 vrrp-group 7 virtual-address 10.187.132.193
set interfaces ge-1/0/2 unit 108 family inet address 10.187.132.227/27 vrrp-group 8 virtual-address 10.187.132.225

我们需要提取一些列并将其存储到不同的变量中。数据来自过滤文件后,因此它将是$_。有没有办法将它存储到不同的数组中?

$address[0] = "10.187.132.3/27"
$vrrp-group[0] = "1"
$virtual-address[0] = "10.187.132.1"

$address[1] = "10.187.132.35/27"
$vrrp-group[1] = "2"
$virtual-address[1] = "10.187.132.33"

我尝试过使用 split 但我不知道如何在 perl 上选择特定的列,这很容易用 awk (awk {'print $8'}) 完成。

@address = split(/\s+/, $_);

但是失败了。

预期结果:

@地址:

$VAR1  = '10.187.132.3/27'
$VAR2  = '10.187.132.35/27'
$VAR3  = '10.187.132.67/27'
$VAR4  = '10.187.132.99/27'
$VAR5  = '10.187.132.131/27'
$VAR6  = '10.187.132.163/27'
$VAR7  = '10.187.132.195/27'
$VAR8  = '10.187.132.227/27'

@vrrp-组:

$VAR1  = '1'
$VAR2  = '2'
$VAR3  = '3'
$VAR4  = '4'
$VAR5  = '5'
$VAR6  = '6'
$VAR7  = '7'
$VAR8  = '8'

@虚拟地址:

$VAR1  = '10.187.132.1'
$VAR2  = '10.187.132.33'
$VAR3  = '10.187.132.65'
$VAR4  = '10.187.132.97'
$VAR5  = '10.187.132.129'
$VAR6  = '10.187.132.161'
$VAR7  = '10.187.132.193'
$VAR8  = '10.187.132.225'

【问题讨论】:

    标签: arrays perl


    【解决方案1】:

    您可以使用-n 或-p 和-a 来模拟类似的 行为。 用空格分割行并将字段保存在@F 数组中,因此您可以选择所需的位置:

    perl -MData::Dumper -lane '
        push @array, {
            q|address| => $F[8], 
            q|vrrp-group| => $F[10], 
            q|virtual-address| => $F[12]
        }; 
        END { print Dumper \@array }
    ' infile
    

    产生:

    $VAR1 = [
              {
                'virtual-address' => '10.187.132.1',
                'address' => '10.187.132.3/27',
                'vrrp-group' => '1'
              },
              {
                'virtual-address' => '10.187.132.33',
                'address' => '10.187.132.35/27',
                'vrrp-group' => '2'
              },
              {
                'virtual-address' => '10.187.132.65',
                'address' => '10.187.132.67/27',
                'vrrp-group' => '3'
              },
              {
                'virtual-address' => '10.187.132.97',
                'address' => '10.187.132.99/27',
                'vrrp-group' => '4'
              },
              {
                'virtual-address' => '10.187.132.129',
                'address' => '10.187.132.131/27',
                'vrrp-group' => '5'
              },
              {
                'virtual-address' => '10.187.132.161',
                'address' => '10.187.132.163/27',
                'vrrp-group' => '6'
              },
              {
                'virtual-address' => '10.187.132.193',
                'address' => '10.187.132.195/27',
                'vrrp-group' => '7'
              },
              {
                'virtual-address' => '10.187.132.225',
                'address' => '10.187.132.227/27',
                'vrrp-group' => '8'
              }
            ];
    

    UPDATE:脚本等同于前面的单行(参见cmets):

    #!/usr/bin/env perl
    
    use warnings;
    use strict;
    use Data::Dumper;
    
    my @array;
    
    while ( <> ) { 
        chomp;
        my @F = split;
        push @array, {
            q|address| => $F[8], 
            q|vrrp-group| => $F[10], 
            q|virtual-address| => $F[12]
        };  
    }
    
    print Dumper \@array;
    

    【讨论】:

    • 它是如何在脚本中实现的?
    • @rabka:哪个脚本?这是一个单行。在END 部分中,您有一个哈希数组,可以对数据做任何您想做的事情。
    • 是否可以将其插入到脚本中?我们是怎么做到的?
    • @rabka:我已经添加了脚本。
    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2019-11-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多