【问题标题】:Appending Array values next to each other in Perl [closed]在Perl中彼此相邻地附加数组值[关闭]
【发布时间】:2017-04-18 04:36:41
【问题描述】:

我有两个数组:@devicedat@timestamp 在下面的方式。

@timestamp

 Nov 20 21:58:41 PST 2016
 Nov 20 21:59:11 PST 2016
 Nov 20 21:59:41 PST 2016

@devicedat

 sda              28.00     0.00 10.00  0.00   156.00     0.00    31.20     0.04    3.70   3.60   3.60
 sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
 sda2             28.00     0.00  4.00  0.00   128.00     0.00    64.00     0.03    6.50   6.50   2.60
 sda3              0.00     0.00  6.00  0.00    28.00     0.00     9.33     0.01    1.83   1.67   1.00
 sdb               0.00     0.00  0.00  2.00     0.00     8.00     8.00     0.00    0.50   0.50   0.10
 sdb1              0.00     0.00  0.00  2.00     0.00     8.00     8.00     0.00    0.50   0.50   0.10
 sdc               0.00     0.00 1351.00  0.00  5404.00     0.00     8.00     0.76    0.56   0.56  76.00
 sdc1              0.00     0.00 1351.00  0.00  5404.00     0.00     8.00     0.76    0.56   0.56  76.00
 sda               0.00     0.00 14.00  0.00    56.00     0.00     8.00     0.01    0.50   0.50   0.70
 sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
 sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
 sda3              0.00     0.00 14.00  0.00    56.00     0.00     8.00     0.01    0.50   0.50   0.70
 sdb               0.00     0.00 89.00  0.00   356.00     0.00     8.00     0.14    1.52   1.52  13.50
 sdb1              0.00     0.00 89.00  0.00   356.00     0.00     8.00     0.14    1.52   1.52  13.50
 sdc               0.00     0.00 513.00  0.00  2052.00     0.00     8.00     0.75    1.45   1.46  74.70
 sdc1              0.00     0.00 513.00  0.00  2052.00     0.00     8.00     0.75    1.45   1.46  74.70

我想将时间戳附加到 Perl 中的每个磁盘,并且需要如下输出:

Nov 20 21:58:41 PST 2016,sda 28.00 0.00 10.00 0.00 156.00 0.00 31.20 0.04 3.70 3.60 3.60
Nov 20 21:58:41 PST 2016, sda1.....
Nov 20 21:58:41 PST 2016, sda2.....
Nov 20 21:58:41 PST 2016, sda3.....
Nov 20 21:58:41 PST 2016, sdb......
Nov 20 21:58:41 PST 2016, sdb1.....
Nov 20 21:58:41 PST 2016, sdc......
Nov 20 21:58:41 PST 2016, sdc1.....
Nov 20 21:59:11 PST 2016, sda......
Nov 20 21:59:11 PST 2016, sda1.....
Nov 20 21:59:11 PST 2016, sda2.....
Nov 20 21:59:11 PST 2016, sda3.....
Nov 20 21:59:11 PST 2016, sdb......
Nov 20 21:59:11 PST 2016, sdb1.....

如何在 Perl 中以上述方式附加值?我希望附加到所有磁盘的时间戳的值以 CSV 格式解释设备数据。

【问题讨论】:

  • 嗨,Alexander,对不起,我对 perl 很陌生,我有一个 gz 文件,其中包含 OS Watcher 的 iostat 输出。我正在使用下面的行来保留数组时间戳和 Devicedata。 @devicedat = zcat xyz.xyz.com_iostat_16.11.20.2100.dat.gz | grep ^sd | sort -s--n -k1,1; @timestamp = zcat $file | grep zzz | cut -d" " -f3-7;所以我正在寻找一个可以根据需要进行追加的函数或命令。
  • 如果问题在于您不了解 Perl,那么解决方案就在您手中。我们真的无能为力。

标签: perl scripting


【解决方案1】:

您想要的称为Cartesian Product。您必须将每个集合的迭代器相互嵌套,如下所示:

use strict;
use warnings;

my @timestamp = (
    'Nov 20 21:58:41 PST 2016',
    'Nov 20 21:59:11 PST 2016',
    'Nov 20 21:59:41 PST 2016',
);

my @devicedat = (
    'sda    28.00     0.00   10.00  0.00   156.00     0.00    31.20     0.04    3.70   3.60   3.60',
    'sda1    0.00     0.00    0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00',
    'sda2   28.00     0.00    4.00  0.00   128.00     0.00    64.00     0.03    6.50   6.50   2.60',
    'sda3    0.00     0.00    6.00  0.00    28.00     0.00     9.33     0.01    1.83   1.67   1.00',
    'sdb     0.00     0.00    0.00  2.00     0.00     8.00     8.00     0.00    0.50   0.50   0.10',
    'sdb1    0.00     0.00    0.00  2.00     0.00     8.00     8.00     0.00    0.50   0.50   0.10',
    'sdc     0.00     0.00 1351.00  0.00  5404.00     0.00     8.00     0.76    0.56   0.56  76.00',
    'sdc1    0.00     0.00 1351.00  0.00  5404.00     0.00     8.00     0.76    0.56   0.56  76.00',
    'sda     0.00     0.00   14.00  0.00    56.00     0.00     8.00     0.01    0.50   0.50   0.70',
    'sda1    0.00     0.00    0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00',
    'sda2    0.00     0.00    0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00',
    'sda3    0.00     0.00   14.00  0.00    56.00     0.00     8.00     0.01    0.50   0.50   0.70',
    'sdb     0.00     0.00   89.00  0.00   356.00     0.00     8.00     0.14    1.52   1.52  13.50',
    'sdb1    0.00     0.00   89.00  0.00   356.00     0.00     8.00     0.14    1.52   1.52  13.50',
    'sdc     0.00     0.00  513.00  0.00  2052.00     0.00     8.00     0.75    1.45   1.46  74.70',
    'sdc1    0.00     0.00  513.00  0.00  2052.00     0.00     8.00     0.75    1.45   1.46  74.70',
);

my @product = ();
for my $timestamp ( @timestamp ){
    for my $devicedat ( @devicedat ){
        push @product, "$timestamp, $devicedat";
    }
}

print "$_\n" for @product;

更多详情请关注Cartesian Product in Perl

【讨论】:

  • 我尝试了 foreach 循环,但我不需要为 devicedata 数组中的所有设备设置一个时间戳。它应该转到前 6 个磁盘,并且当 sda 在 devicedat 数组中第二次启动时应该打印第二个时间戳。
猜你喜欢
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
相关资源
最近更新 更多