如何在列中添加数字并将总数插入到不同的列中

时间:2015-10-27 15:04:09

标签: linux shell unix awk sed

让我先说一下我是一个完整的脚本新手。

我们有许多管理不当的配额文件,需要更新其总计。我希望有一个脚本可以计算每个卷的总数,而不是每月机械地计算。请参阅下面的示例。

我们的配额文件如下所示:

/vol/vol1/NStorage1             tree    200G
/vol/vol1/NStorage2             tree    5G 
/vol/vol1/NStorage3             tree    300G
/vol/vol1/NStorage4             tree    145G
/vol/vol1/NStorage5             tree    3G
/vol/vol1/NStorage6             tree    5G
#
# vol1 total 700GB

/vol/vol2/NStorage7             tree    20G
/vol/vol2/NStorage8             tree    1G
/vol/vol2/NStorage9             tree    30G
/vol/vol2/NStorage10            tree    55G
/vol/vol2/NStorage11            tree    25G
/vol/vol2/NStorage12            tree    430G
/vol/vol2/NStorage13            tree    20G
#
# vol2 total 550GB

依旧......

我要做的是从第3列获取总和,并将其添加到“volX total #### GB”行。

我曾尝试使用AWK,但它只会执行该列的第一部分,而我不知道如何让它替换每列的总数。

awk '{ sum += $3 } END { print sum }' < file 

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果文件中的单位始终为GB,则可以使用以下行:

awk '!/^#/{s+=$3+0;print;next}NF>1{$NF=$NF+s"GB";s=0}7' file

使用您的输入示例,它将输出:

/vol/vol1/NStorage1             tree    200G
/vol/vol1/NStorage2             tree    5G 
/vol/vol1/NStorage3             tree    300G
/vol/vol1/NStorage4             tree    145G
/vol/vol1/NStorage5             tree    3G
/vol/vol1/NStorage6             tree    5G
#
# vol1 total 1358GB

/vol/vol2/NStorage7             tree    20G
/vol/vol2/NStorage8             tree    1G
/vol/vol2/NStorage9             tree    30G
/vol/vol2/NStorage10            tree    55G
/vol/vol2/NStorage11            tree    25G
/vol/vol2/NStorage12            tree    430G
/vol/vol2/NStorage13            tree    20G
#
# vol2 total 1131GB

更新

如果您希望总和替换 total值,而不是add to,只需:

 awk '!/^#/{s+=$3+0;print;next}NF>1{$NF=s"GB";s=0}7' file