bash sum分组循环

4 bash awk grouping loops

我有一个格式的helpfile1:

client1 bla blahblah 2542 KB
client1 bla blahblah 4342 MB
client1 bla blahblah    7 GB

client2 bla blahblah  455 MB
client2 bla blahblah  455 MB
Run Code Online (Sandbox Code Playgroud)

...

我需要每周一次

client1 SUM xy KB
client2 SUM yx KB
Run Code Online (Sandbox Code Playgroud)

目前即时使用:

sumfunction ()
    {
    inputfile=helpfile1

    for i in `awk -F":" '{print $1}' $inputfile| sort -u | xargs`
    do
    awk -v name=$i 'BEGIN {sum=0};
    $0~name {
    print $0;
    if ($5 == "GB") sum = sum + $4*1024*1024;
    if ($5 == "MB") sum = sum + $4*1024;
    if ($5 == "KB") sum = sum + $4};
    END {print name " SUM " sum " kB"}' $inputfile
    done
    }   

sumfunction | grep SUM | sort -g -r -k 3 > weeklysize
Run Code Online (Sandbox Code Playgroud)

我需要在相当长的文件上使用它,这个awk花费了太多时间.是否有其他代码(仅限bash),以更快地完成此操作?谢谢

hek*_*mgl 5

您可以使用以下awk脚本:

awk '/MB$/{$4*=1024};/GB$/{$4*=1024*1024};{a[$1]+=$4}END{for(i in a){printf "%s %s KB\n",i, a[i]}}' a.txt 
Run Code Online (Sandbox Code Playgroud)

这种格式看起来更好:

/MB$/    {$4*=1024};        # handle MB
/GB$/    {$4*=1024*1024};   # handle GB

# count KB amount for the client
{a[$1]+=$4}

END{
    for(i in a){
        printf "%s %s KB\n",i, a[i]
    }
} 
Run Code Online (Sandbox Code Playgroud)

产量

client1 11788782 KB
client2 931840 KB
Run Code Online (Sandbox Code Playgroud)