Awk记录分离和循环
在这里放屁。我的文件中包含以下数据: 删除以避免混淆 我希望能够在分隔符(例如使用日期)之间获取数据,并对列求和。在最上面一行,我有“date:NAME-delim:以及我可以使用的变量2014” 试着说:“看啊,读这个文件,当你得到‘样本数据’时,只从这些行开始,然后对第7列求和”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
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