2012-08-01 84 views
1

我旁边AWK oneliner:AWK:CONCAT字符串在字典价值数

{dict[$2"@"$6]=($(NF-2)/($(NF-2)+$NF))*100 } END {for (a in dict) { printf "%s %d :" , a, int(dict[a]) }} 

我需要什么,是添加到

($(NF-2)/($(NF-2)+$NF))*100 " out of" $(NF-2)+$NF 

所以我想每个字典组合键的值awk计算所有数学,然后编写字符串并将其作为字典值。我已经尝试过一些空格和括号的组合,但仍然没有运气。

瓦尔从输入流填充:

$2 - host , not unique in input stream 
$3 - partition , not unique in input stream 
$NF - space avail 
$NF-2 - space used 
$(NF-2)+$NF - gives you overall capacity of partiton 

输出是

80% [email protected]/local/1 

输出预期:

80% [email protected]/local/1 out of 112G 

------------- ---------解决方案-----------------------------------

下面有很好的接触,我解决了这个问题。问题是我在printf部分中执行了int(),即截断了输出。尽管如此,我进一步遇到了其他问题,因此我的最终代码与我预期的不同,它会提出问题。

'{key=($2 "@" $6 " out of " int((($(NF-2)+$NF)/1000)/1000) "GB") ; dict[key]=($(NF-2)/($(NF-2)+$NF))*100 } END {for (a in dict) { printf "%s , %d :" , a, int(dict[a]) }}' 

I`ve移动“出”部分辞典键和能力,因为字典值不能在我的情况的字符串,futher我将它与INT进行比较。

+0

我已经添加了详细信息,但它们在我的问题范围内的重要性不高。问题是,如何将数学结果(字符串+数学结果)连接到字典中。我开始认为awk有这个问题。 – 2012-08-01 18:31:05

回答

1

串联工作正常。这不是问题。

问题是您打印时正在计算字典值的int()。由于该值是一个字符串,所以结果被截断。如果您需要使用int(),请在执行计算时进行,而不要在打印时进行。顺便说一下,如果您提供了一些示例数据,那么测试您的代码并提供答案会容易得多。这一点尤其重要,因为它有时候就是这样,因为问题出现在一个不是预期的地方。

+0

谢谢丹尼斯。我现在感到很蠢。事实上,我完全忘了printf部分,并没有检查它。 – 2012-08-02 10:07:54