Awk记录分离和循环

时间:2014-07-25 00:37:58

标签: awk record nested-loops separator

在这里有一些脑筋。我在文件中有以下数据:

删除以避免混淆

我希望能够将数据 BETWEEN 作为分隔符(例如使用日期)并对一列进行求和。在顶部,我有“日期:NAME -delim:使用我可以使用的变量2014。

试着说:“看看awk读取这个文件,当你得到'样本数据'时,只从那些行开始,总结第7列”

awk -RS “2014” -F “:” ‘/sample data/'{ sum += $2 } END { print sum }' filename.txt

我的猜测是(无需转换为字节),我可以循环,让MB存储它们,计算它们,取GB存储它们,并计算它们。有什么指针吗?

一厢情愿:

awk 'BEGIN { 2014 = ""} { if ($8 == “[0-9]GB") size = sum += $8"GB"; else … blah blah blah [0-9]MB}’ 

----编辑

我试过了。这里或多或少是我正在使用的确切数据(道歉但我试图在这里尽量减少数据暴露):

这是正确的数据设置,其中包含修改用于消毒的词样

Jul 2014: data disk -delim :

0:Sample_0:0:maps:online:0:Size 40GB15k:20.00GB:segment:3:location:::DA000000000000030:1:1:empty:1:no:0
1:Sample_1:0:maps:online:0:Size 40GB15k:20.00GB:segment:4:location:::DA000000000000031:1:1:empty:1:no:0
2:Sample_2:0:maps:online:0:Size 40GB15k:20.00GB:segment:5:location:::DA000000000000032:1:1:empty:1:no:0

Jul 2014: data network -delim :

0:Sample_3:0:maps:online:0:Size 60GB15k:10.00GB:segment:3:location:::DA000000000000030:1:1:empty:1:no:0
1:Sample_4:0:maps:online:0:Size 60GB15k:10.00GB:segment:4:location:::DA000000000000031:1:1:empty:1:no:0
2:Sample_5:0:maps:online:0:Size 60GB15k:10.00GB:segment:5:location:::DA000000000000032:1:1:empty:1:no:0

对这套不起作用。同样重要的是,如果您注意到,在日期之后,变量会有所不同。我有:磁盘和数据......我不需要/希望两个实例相加。我希望能够说:“看看找到可变磁盘,然后统计你所看到的一切。不要进入数据网络

2 个答案:

答案 0 :(得分:1)

此解决方案使用GNU awk扩展,match function存储捕获括号的内容

gawk -F: '
    $1 ~ /^[[:alpha:]]+ [[:digit:]]+$/ {
        if (sum) print sum
        printf "%s",$0
        sum=0
    } 
    /^[[:blank:]]*$/ {next} 
    {
        match($NF,/([[:digit:].]+)(|GB|TB)/, a)
        if      (a[2] == "GB") { sum += a[1]*1000 } 
        else if (a[2] == "TB") { sum += a[1]*1000*1000 } 
        else                   { sum += a[1] }
    } 
    END {print sum}
' << END

Jul 2014: sample data -delim :

0:Sample0:0:sampleX:online:0:2.00TB
1:Sample1:0:sampleX:online:0:2.00TB
2:Sample2:0:sampleX:online:0:2.00TB

Jul 2014: other data -delim :
0:Sample0:0:sampleX:online:0:3.00
1:Sample1:0:sampleX:online:0:4.00GB
2:Sample2:0:sampleX:online:0:5.00GB

Jul 2014: yet more data -delim :

0:Sample0:0:sampleX:online:0:9.00GB
1:Sample1:0:sampleX:online:0:10.00TB
2:Sample2:0:sampleX:online:0:11.00
END
Jul 2014: sample data -delim :6000000
Jul 2014: other data -delim :9003
Jul 2014: yet more data -delim :10009011

鉴于您的新要求:

gawk -F: '
    $1 ~ /^[[:alpha:]]+ [[:digit:]]+$/ {
        if (sum) print sum
        sum=0
        do_sum = ($2 ~ /disk/)
        if (do_sum) printf "%s", $0
    } 
    /^[[:blank:]]*$/ {next} 
    do_sum {
        match($8,/([[:digit:].]+)(|GB|TB)/, a)
        if      (a[2] == "GB") { sum += a[1]*1000 } 
        else if (a[2] == "TB") { sum += a[1]*1000*1000 } 
        else                   { sum += a[1] }
    } 
    END {if (do_sum) print sum}
'

对于sameple数据,打印

Jul 2014: data disk -delim :60000

答案 1 :(得分:0)

awk -F: '
  BEGIN {
    ksize = 1024
    sizes = "KMGT"
  }
  NF==7 {
    m = 1
    if (substr($7, length($7), 1) != "B")
      n = $7
    else {
      n = substr($7, 1, length($7) - 2)
      j = index(sizes, substr($7, length($7) - 1, 1))
      # if (j == 0) error!!!
      for (i = 1; i <= j; ++i)
        m *= ksize
    }
    sum += n * m
  }
  NF==3 {
    if (m) print sum
    printf "%s ", $0
    sum = 0
  }
  END {
    if (m) print sum
  }
' file

测试m而不是sum允许零和。设置后,m始终为非零。 END条件下的测试正确处理空文件。