【问题标题】:How to format output into columns?如何将输出格式化为列?
【发布时间】:2012-10-30 16:38:24
【问题描述】:

如何修改以下脚本,使其在相应列中显示每个值: 脚本的主体如下所示:

( $vmdisk, $totalio, $readpercentage, $cachehitpercentage, $currentkbpersecond,
  $maximumkbpersecond, $currentiopersecond, $maximumiopersecond
) = split (",", $line);
$totalio =~ s/\"//g;
$readpercentage =~ s/\"//g;
$cachehitpercentage =~ s/\"//g;
$currentkbpersecond =~ s/\"//g;
$maximumkbpersecond =~ s/\"//g;
$currentiopersecond =~ s/\"//g;
$maximumiopersecond =~ s/\"//g;

print "totalio:$totalio readpercentage:$readpercentage cachehitpercentage:$cachehitpercentage currentkbpersecond:$currentkbpersecond maximumkbpersecond:$maximumkbpersecond currentiopersecond:$currentiopersecond maximumiopersecond:$maximumiopersecond";

这将显示这种类型的格式化输出:

totalio:75.0 readpercentage:20.0 cachehitpercentage:93.3 currentkbpersecond:33.8 maximumkbpersecond:33.8 currentiopersecond:15.0 maximumiopersecond:15.0

一切都在一条线上。我的目标是将输出放入列中并使其更具可读性。比如这样:

totalio readpercentage cachehitpercentage

75.00 20.0 93.0

我该怎么做?

【问题讨论】:

  • 我会去的,至少如果你定期做这个报告的话,用 Template::Toolkit 或 HTML::Template 并将报告输出为 HTML 表格。
  • 糟糕!使用 Text::CSV_XS 解析您的输入!
  • 您的拆分方法似乎有点沉重...您能否给我们您的输入?也许像y|"||d;@array=split(" ")...

标签: linux perl scripting output


【解决方案1】:

    printf "%-10s %-10s %-10s\n", $totalio, $readpercentage, $cachehitpercentage; 

应该做你正在寻找的东西。只需根据需要根据模式附加变量。参考:printf

【讨论】:

    【解决方案2】:

    格式是需要考虑的问题,尤其是在您多次进行这些测量并打印到标准输出或日志文件时。 perldoc perlform

    $line = "0.0,75.0,20.0,93.3,33.8,33.8,15.0,15.0";
    
    ( $vmdisk, $totalio, $readpercentage, $cachehitpercentage, $currentkbpersecond, $maximumkbpersecond, $currentiopersecond, $maximumiopersecond) = split (",", $line);
    
    $totalio =~ s/\"//g;
    $readpercentage =~ s/\"//g;
    $cachehitpercentage =~ s/\"//g;
    $currentkbpersecond =~ s/\"//g;
    $maximumkbpersecond =~ s/\"//g;
    $currentiopersecond =~ s/\"//g;
    $maximumiopersecond =~ s/\"//g;
    
    format REPORT_HEADER = 
    -------------------------------------------------------------------------------------------------------
    Total IO     Read %     Cache Hit %     Current kB/sec     Max kB/sec     Current IO/sec     Max IO/sec
    -------------------------------------------------------------------------------------------------------
    .
    
    format REPORT_BODY = 
     @####.#    @###.##         @###.##            @###.##        @###.##            @###.##        @###.##
    $totalio, $readpercentage, $cachehitpercentage, $currentkbpersecond, $maximumkbpersecond, $currentiopersecond, $maximumiopersecond
    .
    
    select(STDOUT);
    
    $~= "REPORT_HEADER";
    write;
    
    $~= "REPORT_BODY";
    write;
    

    会给你这样的输出:

    -------------------------------------------------------------------------------------------------------
    Total IO     Read %     Cache Hit %     Current kB/sec     Mac kB/sec     Current IO/sec     Max IO/sec
    -------------------------------------------------------------------------------------------------------
        75.0      20.00           93.30              33.80          33.80              15.00          15.00
    

    【讨论】:

    • 太棒了!如何添加另一列?例如说我想将时间添加为第一个字段 $time, $readpercentage, ....
    【解决方案3】:

    对不起,我只是走出门,否则我会举一个更好的例子。您正在寻找的东西是formats。在perldoc perlform 阅读更多内容。

    【讨论】:

    • 我听说Perl6::Form(Perl5 的类似 Perl6 的形式)比内置形式好得多。
    【解决方案4】:

    除此之外,还有方便的花花公子Text::Table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 2016-07-23
      • 2016-12-26
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多