在这里有一些脑筋。我在文件中有以下数据:
删除以避免混淆
我希望能够将数据 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
对这套不起作用。同样重要的是,如果您注意到,在日期之后,变量会有所不同。我有:磁盘和数据......我不需要/希望两个实例相加。我希望能够说:“看看找到可变磁盘,然后统计你所看到的一切。不要进入数据网络
答案 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
条件下的测试正确处理空文件。