Awk记录分离和循环

Awk记录分离和循环,awk,record,nested-loops,separator,Awk,Record,Nested Loops,Separator,在这里放屁。我的文件中包含以下数据: 删除以避免混淆 我希望能够在分隔符(例如使用日期)之间获取数据,并对列求和。在最上面一行,我有“date:NAME-delim:以及我可以使用的变量2014” 试着说:“看啊,读这个文件,当你得到‘样本数据’时,只从这些行开始,然后对第7列求和” awk -RS “2014” -F “:” ‘/sample data/'{ sum += $2 } END { print sum }' filename.txt 我的猜测是(无需转换为字节),我可以循环,以M

在这里放屁。我的文件中包含以下数据:

删除以避免混淆

我希望能够在分隔符(例如使用日期)之间获取数据,并对列求和。在最上面一行,我有“date:NAME-delim:以及我可以使用的变量2014”

试着说:“看啊,读这个文件,当你得到‘样本数据’时,只从这些行开始,然后对第7列求和”

awk -RS “2014” -F “:” ‘/sample data/'{ sum += $2 } END { print sum }' filename.txt
我的猜测是(无需转换为字节),我可以循环,以MB存储它们,计算它们,以GBs存储它们,并计算它们。有指针吗

一厢情愿:

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

我试过了。这里或多或少是我正在处理的确切数据(抱歉,但我正在尽量减少数据暴露):

这是正确的数据集,单词SAMPLE MODIFIED FOR sanitation

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

不适用于此集合。同样重要的是,如果您注意到,在日期之后,变量不同。我有:磁盘和数据…我不需要/希望两个实例求和。我想说:“查找变量磁盘,并汇总所有您看到的内容。不要进入数据网络”

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

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

鉴于您的新要求:

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
awk-F:'
开始{
ksize=1024
size=“KMGT”
}
NF==7{
m=1
if(substr($7,length($7),1)!=“B”)
n=7美元
否则{
n=子字符串($7,1,长度($7)-2)
j=索引(大小、子项($7、长度($7)-1、1))
#如果(j==0)错误!!!

对于(i=1;我感谢你花时间帮助我。我试过了,但没有成功。试过转移2美元和8美元仍然不起作用。嗯。它对你发布的示例数据有效。你的真实数据有什么不同?除了系统名称什么都没有。我将通过OSX、FreeBSD和CentOS将其转移到另一个系统。它没有改变
Jul 2014: data disk -delim :60000
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