Add the values of the lines according to a condition

hi everybody :slight_smile:
I am a beginner in bash and I want to convert the result I have here
I want it to be grouped by IP address
so iwanna get for each ip adsress the addition of all bandwidth where ip is 100.1.1.15
in other words for 100.1.1.15 it groups me all the values whose ip address is 100.1.1.15
is it possible?

4,03446 MB              209.85.202.147:443 --> 100.1.1.15:3823
3,78212 MB              172.217.21.206:443 --> 100.1.1.15:3844
1,42352 MB              216.58.210.10:443 --> 100.1.1.15:3672
0,181173 MB             216.58.210.142:80 --> 100.1.1.15:3890
0,0822248 MB            216.58.210.131:443 --> 100.1.1.15:3826
0,0522203 MB            54.71.250.161:443 --> 100.1.1.64:63209
0,0475864 MB            54.71.250.161:443 --> 100.1.1.64:63211
0,0471096 MB            54.71.250.161:443 --> 100.1.1.64:63210
0,0458832 MB            52.49.225.22:443 --> 100.1.1.75:2541
0,0346823 MB            216.58.210.131:443 --> 100.1.1.15:3825
0,0327778 MB            104.20.42.93:443 --> 100.1.1.15:3888
0,0325193 MB            66.102.1.189:443 --> 100.1.1.75:2414
0,032095 MB             216.58.210.142:80 --> 100.1.1.15:3893

Welcome aynar,

I have a few to questions pose in response first:-

  • What have you tried so far?
  • What output/errors do you get?
  • What OS and version are you using?
  • What are your preferred tools? (C, shell, perl, awk, etc.)
  • What logical process have you considered? (to help steer us to follow what you are trying to achieve)

Most importantly, What have you tried so far?

There are probably many ways to achieve most tasks, so giving us an idea of your style and thoughts will help us guide you to an answer most suitable to you so you can adjust it to suit your needs in future.

We're all here to learn and getting the relevant information will help us all.

until now i've changed the output to that

4,03446                 100.1.1.15
3,78212                 100.1.1.15
1,42352                 100.1.1.15
0,181173                100.1.1.15
0,0822248               100.1.1.15
0,0522203               100.1.1.64
0,0475864               100.1.1.64
0,0471096               100.1.1.64
0,0458832               100.1.1.75
0,0346823               100.1.1.15
0,0327778               100.1.1.15
0,0325193               100.1.1.75
0,032095                100.1.1.15
0,0258636               100.1.1.15
0,0189037               100.1.1.18
0,0183878               100.1.1.134
0,0168571               100.1.1.18
0,016758                100.1.1.15
0,0154533               100.1.1.15
0,0149384               100.1.1.15

but i have no idea how to do the rest
i have the idea but i don't know how to apply it
i dont even know if it's possible to do a loop that verify in the second column and and show me for each ip the total of the corresponding number

If you just want them listed together, the sort command would do that. if you only want "100.1.1.15". grep is something to try.

That's where I stop for now. You will learn it and retain it much better if you look up those commands and experiment with how to use them.

P.S. Just saw that you removed a few things from each line. That isn't necessary.

do you want to group or to sum up by ip?

1 Like

thanks for your help

it's no about 100.1.1.15 it's just an exemple i want to know for how much bandwidth is consumed by each ip address
do for each ip i want to have the total of numbers

---------- Post updated at 09:58 AM ---------- Previous update was at 09:57 AM ----------

that's it sum up by ip

awk -F'[ :]' '{a[$(NF-1)]+=$1} END{for(i in a) printf("%s -> %.7f\n", i, a)}' myFile
1 Like

thanks for your response
i dont understand the commande very well
and when i tried it t got that result

-> 9,9555336

seem like it give the total of everything
not per ip

the code is based on a data sample you provided in post 1.

The output should be similar to: 100.1.1.15 -> 8,0000000

As the sample in post#1 has commas in lieu of decimal dots, you might need to convert those first. Try this small adaption of vgersh99's code:

awk -F'[ :]' '
        {sub (/,/, ".", $1)
         a[$(NF-1)] += $1
        }
END     {for(i in a) printf("%s -> %.7f\n", i, a)
        }
' file
100.1.1.15 -> 9.6030529
100.1.1.64 -> 0.1469163
100.1.1.75 -> 0.0784025

RudiC,
the OP's locale might be different, but good catch.

I was also thinking of DOS line terminators (<CR>, <carriage return, ^M, \r, or 0x0D), which would explain the strange output s/he posted, but there were none in the sample data.