【问题标题】:Parse the large test files using awk使用 awk 解析大型测试文件
【发布时间】:2014-06-17 19:27:24
【问题描述】:

我正在寻找使用 awk 解析空格分隔的输入文本文件。每个组的列代码可以有不止一行。对此我将不胜感激。

输入文件:

TR 1   
Action   

Success/Failure 
8.1.1.1   RunOne   80   48
8.1.1.2   RunTwo   80   49
8.1.1.3   RunThree   100   100
8.1.1.4   RunFour   20   19
8.1.1.5   RunFive   20   20
Action Time   16:47:42
Action2   

Success/Failure 
8.1.2.1   RunSix   80   49
8.1.2.2   RunSeven   80   80
8.1.2.3   RunEight   80   80
Action2 Time   03:26:31

TR 2    
Action

Success/Failure
8.1.1.1   RunOne   80   48
8.1.1.2   RunTwo   80   49
8.1.1.3   RunThree   100   100
8.1.1.4   RunFour   20   19
8.1.1.5   RunFive   20   20
Action Time   16:47:42
Action2   

Success/Failure 
8.1.2.1   RunSix   80   49
8.1.2.2   RunSeven   80   80
8.1.2.3   RunEight   80   80
Action2 Time   03:26:31

所需的输出文件

------------------
s.no  Runno   Runname val1 val2  %val1&val2
1.    8.1.1.1 Runone  160  96    %       #val1 and Val2 should display as sum of TR1&TR2
2.    8.1.1.2 Runtwo  160  98
3.    8.1.1.3 Runthree 200 200
4.    8.1.1.4 RunFour 40 38
....... 

并且还没有从每个 TR 1(TestRun) 中找到每个 Runname 的出现

代码如下

#!/usr/bin/awk -f

BEGIN {
    # You can customize this to change your output layout based on your preference.
    format = "%-10s%-7s%-5s%-8s\n”
    printf format, “Runno”, “Runname”, “Val1”, “Val2”
}
++i==2{
    l = $1
}
i>100{
    if (/^[[:blank:]]*$/) {
        i = 0
    } else if (NF > 1) {
        printf format, l, $1, $2, $3, $4, $5
        p1=$1; p2=$2; p3=$3; p5=$5
    } else {

        printf format, l, p1, p2, p3, $1, p5
    }
}

【问题讨论】:

  • 你想做什么?获得所需输入的要求是什么?为什么只有 8.1.1.X 的?
  • 嗨,这是其中一项测试的输出文件。并且该文件具有不同的迭代(TR 1 和 TR 2 ...)。我必须解析文件并显示每个迭代的 Runno 总数、Runname。 Runno 可以为每次迭代重复多次。 Runno 仅从 8.1.1.X;s 开始。如上所述,我需要拆分/解析文件并显示在表格列中。
  • echo “输入号码:” 读取 n1 awk '/^$/ {ca=""; cp=""} /^#/ {ca=ca " " $0} /^$n1/ && ca {cp=ca; ca=""} /^$n1/ {print $0 " " cp}' 请建议我如何从输入中获取值

标签: bash awk


【解决方案1】:

这可能会给你一个起点。 注意:输出未排序,并且缺少输出的标题和第一列,但我将其留给您!

awk '/^8\./ { a[$1 " " $2] += $3 ; b[$1 " " $2] += $4 } 
     END { for (k in a) { 
             printf("%s %i %i\n",k,a[k],b[k]) 
         } 
    }' INPUTFILE
  1. /^8\./ 仅适用于相关行
  2. a[$1 " " $2] += $3 ; b[$1 " " $2] += $4 为相关行存储并递增第三和第四列
  3. 最后通过遍历a数组打印相关数据,同时从b数组中获取数据。

【讨论】:

  • 不需要第一行的12
  • @Jidder,你当然是对的。我复制了一个旧版本:-)
  • @Jidder,真丢脸 :-)
  • awk '/^$/ {ca=""; cp=""} /^#/ {ca=ca " " $0} /^8.1.1.1/ && ca {cp=ca; ca=""} /^8.1.1.1/ {print $0 " " cp}'。请建议我如何使用上述代码的输入值。
  • echo “输入号码:” 读取 n1 awk '/^$/ {ca=""; cp=""} /^#/ {ca=ca " " $0} /^$n1/ && ca {cp=ca; ca=""} /^$n1/ {print $0 " " cp}' 请建议我如何从输入中获取值
猜你喜欢
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多