Help to find the value in KB


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Help to find the value in KB
# 1  
Old 07-04-2013
Help to find the value in KB

Hi Experts,
How to convert this data into KB value, The output should be added value of the 5 lines.
[ g=1024*1024 KB m=1024 KB ]

Code:
2.1g
1.7g
426m
2.4g
1.9g


Thanks.

---------- Post updated at 05:29 PM ---------- Previous update was at 05:14 PM ----------

I got it with bc:


$
Code:
cat file|sed 's/g/*g/;s/m/*m/g'|awk '{print "g=1024*1024;m=1024;" $1"+"$2"+"$3"+"$4"+"$5}' RS=""|bc -ql
8929689.6

# 2  
Old 07-04-2013
You can get rid of all that pipeline, a better approach would be:
Code:
awk '
        BEGIN {
                OFMT = "%.2f"
        }
        {
                V = $0
                sub ( /[^0-9.]/, X, V )

                if ( $0 ~ /[gG]/ )
                {
                        T += V * 1024 * 1024
                        next
                }
                if ( $0 ~ /[mM]/ )
                {
                        T += V * 1024
                }
        }
        END {
                print T
        }
' file

This User Gave Thanks to Yoda For This Post:
# 3  
Old 07-04-2013
Quote:
Originally Posted by Yoda
You can get rid of all that pipeline, a better approach would be:
Code:
awk '
...

Your solution is more efficient, but in the special case of very large numbers, bc's arbitrary precision would be better.

AWK stores all numbers (integers included) as doubles, so, assuming IEEE 754 64-bit floating point representation, very large is somewhere around 2^53 (on the order of 9 x 10^15, short scale quadrillion). Beyond that most integers cannot be represented without loss of precision.

I realize that it's unlikely that numbers of this magnitude will arise, given that the OP's solution only handles 5 values and none are very large. I simply mention the possibility for completeness' sake.

A simpler pipeline which doesn't hardcode operands:
Code:
sed 's/m/*1024/; s/g/*1048576/' | paste -sd+ - | bc

Regards,
Alister

Last edited by alister; 07-04-2013 at 09:54 PM..
These 2 Users Gave Thanks to alister For This Post:
# 4  
Old 07-05-2013
Alister like the approach with bc, and appreciate for the explanation for cases with large values & using bc's arbitrary precision , awesome little pipeline..,
Yoda 's awk code also nicely worked,

Thank you, all.

---------- Post updated at 01:34 AM ---------- Previous update was at 12:22 AM ----------

Here got it without much pipeline(s) and using awk + bc's arbitrary presscion :

Code:
linux$ awk '{V=$0;sub(/[^0-9.]/,x,V);if($0~/g/)A[NR]=V"*1024*1024";if($0~/m/)A[NR]=V"*1024"}END{d="+";for(i=1;i<=NR;i++){if(i~NR)d="";printf A[i]d}printf "\n"}' file|bc
8929689.6

Thanks again,

---------- Post updated at 02:18 AM ---------- Previous update was at 01:34 AM ----------

I did not find any problem with the solution given by Yoda for large files/entries also, and I have taken as a solution. Excellent code!.

Thank You .
# 5  
Old 07-05-2013
Quote:
Originally Posted by rveri
I did not find any problem with the solution given by Yoda for large files/entries
Typical sysadmin work is unlikely to exceed the precise-integral range of 64-bit double precision floating point, but it's good to know its limits.

Loss of precision:
Code:
$ awk 'BEGIN {print 2^53; print 2^53+1}'
9007199254740992
9007199254740992

$ echo 2^53+1 | bc
9007199254740993

The same issue occurs at the other limit, if you subtract 1 from -2^53.

Beyond 2^53 but before overflow occurs, there's a very large range of mostly imprecisely represented integers:
Code:
$ awk 'BEGIN {print 1.7976931348623158 * 10^308}' | fold -w70
1797693134862315708145274237317043567980706000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000


$ awk 'BEGIN {print 1.7976931348623159 * 10^308}'
inf

$ echo '1.7976931348623159 * 10^308' | bc
17976931348623159000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
0000000000000000000000000000000000000.0000000000000000

The implementation used in the preceding examples:
Code:
$ awk --version | head -n2
GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.2, GNU MP 4.3.2)
Copyright (C) 1989, 1991-2013 Free Software Foundation.

Regards,
Alister
This User Gave Thanks to alister For This Post:
# 6  
Old 07-05-2013
Alister , you are right.
I never tried to validate the arithmetic output of awk happening from the script, and assuming it was right for the large numbers calculation as well.
Now I can see the difference , you have shown it precisely. Thank you.

These results are showing issue with awk arithmatic work :
Code:
$ awk 'BEGIN {printf "%.f\n%.f\n",2^53,2^53+1}'
9007199254740992
9007199254740992

Code:
$ awk 'BEGIN {printf "%.f\n%.f\n",2^53,2^53+2}'
9007199254740992
9007199254740994


Code:
$ awk 'BEGIN {printf "%.f\n%.f\n",2^60,2^60+1}'
1152921504606846976
1152921504606846976


#Correct result with bc:
Code:
$ echo "2^60+1"|bc
1152921504606846977

Adding 2 , looks result came ok, but not with 1. Also with the other examples as you have shown we see the issue when overflow happens with large values.

So here I am convinced that for large arithmetic work awk is not a very suitable tool but bc the arbitrary precision calculator to be use.

So as per the accurate arithmetic operation bc wins.


Thanks,
# 7  
Old 07-05-2013
To be clear, it's not an issue with AWK arithmetic. It is the result of the floating point representation implemented by most hardware.

If this were commonly a problem, you would have already encountered it. For most things, it's not an issue. But, when it is, the price of arbitrary precision arithmetic is performance: it is much slower.

By the way, you don't have to go big to encounter issues; 1/10 is a simple 0.1 in decimal but in binary it is a neverending sequence.

Regards,
Alister
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Find string1, when true find string2 in reverse direction

Hello, This is a bit complicated for me. My scenario in MyFile: Search string1, When string1 is found, grep the line containing string1, go back over that line in upward direction and grep the first line containing string2. Here is an example: MyFile His email address... (17 Replies)
Discussion started by: baris35
17 Replies

2. Shell Programming and Scripting

How to find a file with a specific pattern for current sysdate & upon find email the details?

I need assistance with following requirement, I am new to Unix. I want to do the following task but stuck with file creation date(sysdate) Following is the requirement I need to create a script that will read the abc/xyz/klm folder and look for *.err files for that day’s date and then send an... (4 Replies)
Discussion started by: PreetArul
4 Replies

3. Shell Programming and Scripting

find: missing argument to `-exec' while redirecting using find in perl

Hi Friends, Please help me to sort out this problem, I am running this in centos o/s and whenever I run this script I am getting "find: missing argument to `-exec' " but when I run the same code in the command line I didn't find any problem. I am using perl script to run this ... (2 Replies)
Discussion started by: ramkumarselvam
2 Replies

4. Shell Programming and Scripting

How to use grep & find command to find references to a particular file

Hi all , I'm new to unix I have a checked project , there exists a file called xxx.config . now my task is to find all the files in the checked out project which references to this xxx.config file. how do i use grep or find command . (2 Replies)
Discussion started by: Gangam
2 Replies

5. Shell Programming and Scripting

Find, regular expression, anyway to simplify this find command?

Hello everyone, first post here, trying to learn scripting on my own and this forum as been really helpful so far. I made few little scripts working great but I m facing some problems with RE. I have a bunch of files in many subdirectories called *001.ext *002.ext OR simple *.ext or *01.ext... (7 Replies)
Discussion started by: Sekullos
7 Replies

6. Linux

Simplified find command to find multiple file types

Hi, I'm using the following command to find the multiple requierd file types and its working fine find . -name "*.pl" -o -name "*.pm" -o -name "*.sql" -o -name "*.so" -o -name "*.sh" -o -name "*.java" -o -name "*.class" -o -name "*.jar" -o -name "*.gz" -o -name "*.Z" -type f Though... (2 Replies)
Discussion started by: vickramshetty
2 Replies

7. UNIX for Dummies Questions & Answers

how to find a file named vijay in a directory using find command

I need to find whether there is a file named vijay is there or not in folder named "opt" .I tried "ls *|grep vijay" but it showed permission problem. so i need to use find command (6 Replies)
Discussion started by: amirthraj_12
6 Replies

8. Shell Programming and Scripting

Little bit weired : Find files in UNIX w/o using find or where command

Yes , I have to find a file in unix without using any find or where commands.Any pointers for the same would be very helpful as i am beginner in shell scritping and need a solution for the same. Thanks in advance. Regards Jatin Jain (10 Replies)
Discussion started by: jatin.jain
10 Replies

9. Shell Programming and Scripting

command find returned bash: /usr/bin/find: Argument list too long

Hello, I create a file touch 1201093003 fichcomp and inside a repertory (which hava a lot of files) I want to list all files created before this file : find *.* \! -maxdepth 1 - newer fichcomp but this command returned bash: /usr/bin/find: Argument list too long but i make a filter all... (1 Reply)
Discussion started by: yacsil
1 Replies
Login or Register to Ask a Question