awk evaluating a string as a math expression


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting awk evaluating a string as a math expression
# 1  
Old 08-07-2013
awk evaluating a string as a math expression

Hi,
I am writing a script in awk trying to replace strings that are math expressions with their result.
For example, I have a file that looks like this:

5-1
32/8-1
4*12
17+1-3

I would like to get the following output:

4
3
48
15

I tried doing it the following way (using the "bc" unix command):
Get the string into an awk variable and then send it to the shell.

The following line works (without using an input variable).
The outputVariable gets the correct answer "4".
Code:
"echo 5-1 | bc" | getline outputVariable;

So, I tried doing it like this:
Code:
"echo "inputVariable" | bc" | getline outputVariable;

This, of course, does not work.

I tried printing it to a file and then taking the string from a file:
Code:
print inputVariable > "./temp"
"tail -1 ./temp | bc" | getline outputVar

This does not work either.

I am out of ideas.

P.S
I did not come up with any way to transform the string into a math expression that awk can process internally (without going to shell).
Maybe there's a way, and this can be a good solution for me.

Thank you for your help.
# 2  
Old 08-07-2013
Code:
while read line;do echo $(($line));done < infile
4
3
48
15

# 3  
Old 08-07-2013
Quote:
Originally Posted by Jotne
Code:
while read line;do echo $(($line));done < infile
4
3
48
15

Sorry,
I don't understand.
# 4  
Old 08-07-2013
perl solution
Code:
$ cat file
5+1
5*9
6/4
7-1

$ cat file | perl -nle 'print eval($_)'
6
45
1.5
6

# 5  
Old 08-07-2013
Quote:
Originally Posted by rajamadhavan
perl solution
Code:
$ cat file
5+1
5*9
6/4
7-1

$ cat file | perl -nle 'print eval($_)'
6
45
1.5
6

OK guys.
I am sorry, I did not make my question clear enough.
My file does not look so simple, it is more complex.
Here's the real input:

Code:
wire        [32-1:0]       jerry_AWADDR;
wire                       jerry_AWVALID;
wire         [4-1:0]       jerry_AWCACHE;
wire         [4-1:0]       jerry_AWID;
wire         [4-1:0]       jerry_AWLEN;
wire         [2-1:0]       jerry_AWLOCK;
wire         [3-1:0]       jerry_AWPROT;
wire         [3-1:0]       jerry_AWSIZE;
wire         [2-1:0]       jerry_AWBURST;
wire        [64-1:0]       jerry_WDATA;
wire         [4-1:0]       jerry_WID;
wire                       jerry_WLAST;
wire         [8-1:0]       jerry_WSTRB;
wire                       jerry_WVALID;
wire                       jerry_BREADY;

Now, I would like to make it look like this:
Code:
wire        [31:0]       jerry_AWADDR;
wire                       jerry_AWVALID;
wire         [3:0]       jerry_AWCACHE;
wire         [3:0]       jerry_AWID;
wire         [3:0]       jerry_AWLEN;
wire         [1:0]       jerry_AWLOCK;
wire         [2:0]       jerry_AWPROT;
wire         [2:0]       jerry_AWSIZE;
wire         [1:0]       jerry_AWBURST;
wire        [63:0]       jerry_WDATA;
wire         [3:0]       jerry_WID;
wire                       jerry_WLAST;
wire         [7:0]       jerry_WSTRB;
wire                       jerry_WVALID;
wire                       jerry_BREADY;

I hope this makes it clearer.

Thank you.
# 6  
Old 08-07-2013
This bash script
while read line;do echo $(($line));done < infile
reads the expression from the file, evaluate it and then print the result.
If you give us some clue of what the goal is, we could give more help.
# 7  
Old 08-07-2013
Code:
awk -F "[:[]" '/:/{"echo $(("$2"))"|getline var;$2="[" var ":"}1' OFS= infile


Last edited by rdcwayx; 08-07-2013 at 07:11 AM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

awk If expression - Return string if not true

Hi, I have the following txt file List_With_Duplicates.txt; a,1,1 b,3,4 c,5,2 d,6,1 e,3,3 f,3,7 When I run the command awk -F ',' '{if($2==$3){print $1","$2","$3}}' List_With_Duplicates.txt I get the following output; a,1,1 e,3,3 This works! as I've compared the 2nd & 3rd... (7 Replies)
Discussion started by: mmab
7 Replies

2. Shell Programming and Scripting

Math count %memory using awk

Hi expert, i have log this: Memory: 74410384 Memory: 75831176 Memory: 77961232 Memory: 77074656 Memory: 76086160 Memory: 77128592 Memory: 78045384 Memory: 76696040 Memory: 72401176 Memory: 72520016 Memory: 72137016 Memory: 73175832 Memory: 73034528 Memory: 71770736 Memory:... (4 Replies)
Discussion started by: justbow
4 Replies

3. Shell Programming and Scripting

Count math using awk

Hi expert, I have log : TOTAL-TIME : 2125264636 DATA-BYTES-DOWN : 3766111307032 DATA-BYTES-UP : 455032157567 DL = (3766111307032/2125264636)/1024 = 1.73 UL = (455032157567/2125264636)/1024 = 0.21 I want the result : TOTAL = 1.94 ... (4 Replies)
Discussion started by: justbow
4 Replies

4. Solaris

Korn shell - evaluating string gives wrong results due to limitations

Anyone ever seen this? Someone mentioned this the other day.... If you do, for instance, in korn shell, echo $(5.2+2.5), it gives the result of 6 regardless. Can't remember why but it was the limitation of the korn shell. (5 Replies)
Discussion started by: psychocandy
5 Replies

5. Shell Programming and Scripting

awk math and csv output

Hi I have this list 592;1;Z:\WB\DOCS;/FS3_100G/FILER112/BU/MPS/DOCS;;;;\\FILER112\BUMPS-DOCS\;580,116,544,878 Bytes;656,561 ;77,560 592;2;Z:\WB\FOCUS;/FS3_100G/FILER112/BU/MPS/FOCUS;;;;\\FILER112\BUMPS-FOCUS\;172,430 Bytes;6 ;0 ... (12 Replies)
Discussion started by: nakaedu
12 Replies

6. Shell Programming and Scripting

Need help with AWK math

I am trying to do some math, so that I can compare the average of six numbers to a variable. Here is what it looks like (note that when I divide really big numbers, it isn't a real number): $ tail -n 6 named.stats | awk -F\, '{print$1}' 1141804 1140566 1139429 1134210 1084682 895045... (3 Replies)
Discussion started by: brianjb
3 Replies

7. Shell Programming and Scripting

awk math operation on two files

Hi, I need your help. I've got two files and i need to add 2nd line after occurrence of "Group No X" from data2.txt to 3rd line (after occurrence of "Group No X") from data1.txt. There is the same number of "Groups" in both files and the numbers of groups have the same pattern. data1.txt Group... (2 Replies)
Discussion started by: killerbee
2 Replies

8. UNIX for Dummies Questions & Answers

awk logic and math help

Hi, My file has 2 fields and millions of lines. variableStep chrom=Uextra span=25 201 0.5952 226 0.330693 251 0.121004 276 0.0736858 301 0.0646982 326 0.0736858 401 0.2952 426 0.230693 451 0.221004 476 0.2736858 Each field either has a... (6 Replies)
Discussion started by: wyarosh
6 Replies

9. Shell Programming and Scripting

How can awk search a string without using regular expression?

Hello, Awk seem treat the pattern as regular expression, how can awk search not using regular expression? e.g. just represent for "", not "A" or "a" . I don't want to add backslash . (2 Replies)
Discussion started by: 915086731
2 Replies

10. Shell Programming and Scripting

String math help needed

#!/usr/bin/ksh #LOGFILE=/var/opt/ixos/log/notification_warning.log #DAT1=/var/opt/ixos/monitor/percentages.dat #DAT2=/var/opt/ixos/monitor/mountpoints.dat THRESHOLD=75 #`rm $DAT1` #`rm $DAT2` `bdf | grep /var/opt/ixos | awk '{ print $4 }' | cut -f1 -d"%" > test.dat` `bdf | grep... (1 Reply)
Discussion started by: petachi
1 Replies
Login or Register to Ask a Question