awk --> math-operation in a array


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting awk --> math-operation in a array
# 1  
Old 10-22-2013
awk --> math-operation in a array

Hi

main object is categorize the difference of data-values (TLUFT02B - TLUFT12B).
herefor i read out data-files which are named
acording to the timeformat yyyymmddhhmm.
Code:
WR030B      266.48 Grad      0
WR050B      271.46 Grad      0
WR120B      268.11 Grad      0
WV030B        2.51 m/s       0
WV050B        3.47 m/s       0
WV120B        4.82 m/s       0
TLUFT02B      7.82 °C       0
TLUFT12B      6.87 °C       0
NSCHLB        0.00 mm        0

i try to read out the data and write it in a new file, with ...
Code:
#!/bin/bash
a=$(date --date '1 month ago' +%m)
e=$(date +%m)
y=$(date +%Y)
home=$HOME/Desktop/Messdaten/METE
cd $home
fpat=$(ls `eval echo $y{$a,$e}*` | tail -n 1584) ## 1584 Dateien entspr. 11 Tagen
for i in $fpat
do
      if test -f "$i"
      then
         Dy=${i:2:2} Dm=${i:4:2} Dd=${i:6:2}
        UZh=${i:8:2} UZm=${i:10:2}
        res=$(awk '{A[$1]=$2}END{print A["WV120B"], A["WR120B"], A["NSCHLB"], A["TLUFT12B"], A["TLUFT02B"]}' OFS='\t' "$i")
       T120=$(awk '{B[$1]=$2}END{print B["TLUFT12B"]}' "$i")
        T20=$(awk '{C[$1]=$2}END{print C["TLUFT02B"]}' "$i")
        printf "%s/%s/%s-%s:%s\t%s\t%s\n" $Dm $Dd $Dy $UZh $UZm "$res" "$T20-$T120"
      else
        DAT=$(date +%Y%m%d)
        printf "$DAT - Datei $i nicht vorhanden" >> "$home/../Logfiles/Log_$(date +%Y%m%d).log"
    fi
done

I want the difference of the values T20 and T120 -- blue!
but in the printf-comand gave me the listed values seperatet by the minus.
Please, can someone give me a hint
thanks in advance,
IMPe

Last edited by IMPe; 10-22-2013 at 05:19 AM..
# 2  
Old 10-22-2013
You are printing string find out difference here

Integer
Code:
$ a=10; b=8
$ printf "%d\n" $(echo "$a-$b" | bc)
2

Floating point
Code:
$ a=10; b=8
$ printf "%f\n" $(echo "$a-$b" | bc)
2.000000

String
Code:
$ a=10; b=8
$ printf "%s\n" "$a-$b"
10-8

print as string after calculation
Code:
$ a=10; b=8
$ printf "%s\n" $((a-b))
2


Last edited by Akshay Hegde; 10-22-2013 at 05:48 AM..
This User Gave Thanks to Akshay Hegde For This Post:
# 3  
Old 10-22-2013
Instead of "$T20-$T120", the proper syntax would be "$(( T20 - T120 ))"
--edit--
That should be $(echo "$T20 - $T120" | bc) since it is bash, not ksh93

Last edited by Scrutinizer; 10-22-2013 at 07:01 AM..
This User Gave Thanks to Scrutinizer For This Post:
# 4  
Old 10-22-2013
Quote:
Originally Posted by Akshay Hegde
You are printing string find out difference here
Thank you for your immediate help - i understand the mistake! Unfortunately it is not working well. i changed ...
Code:
printf "%s/%s/%s-%s:%s\t%s\t%f\n" $Dm $Dd $Dy $UZh $UZm "$res" "$T20-$T120"

... the script printout gave me
Code:
line 17: printf: 17.10-17.02: invalid number

thanks in advance!
IMPe

Last edited by Scrutinizer; 10-22-2013 at 06:07 AM.. Reason: addtional code tags
# 5  
Old 10-22-2013
Quote:
Originally Posted by IMPe
Thank you for your immediate help - i understand the mistake! Unfortunately it is not working well. i changed ...
Code:
printf "%s/%s/%s-%s:%s\t%s\t%f\n" $Dm $Dd $Dy $UZh $UZm "$res" "$T20-$T120"

... the script printout gave me
line 17: printf: 17.10-17.02: invalid number

thanks in advance!
IMPe
it was supposed to be
Code:
$((T20-T120))

OR
Code:
$(echo "$T20-$T120" | bc)

This User Gave Thanks to Akshay Hegde For This Post:
# 6  
Old 10-22-2013
Quote:
Originally Posted by Scrutinizer
Instead of "$T20-$T120", the proper syntax would be "$(( T20 - T120 ))"
--edit--
That should be $(echo "$T20 - $T120" | bc) since it is bash, not ksh93
Thanks a lot! Sorry i've forgotten to tell, that i'm using bash. And with
$(echo "$T20 - $T120" | bc)
it's working fine.
how can i extend the echo-term. finally i want to check in which range the difference is. So is it between 0 an 1, then print A. Is it between 1 and 2 print B.
Is it possible to construct this with a case-statement?

Thanks in advance!
IMPe
# 7  
Old 10-22-2013
As you are using awk anyhow, why don't you do the maths and formatting all in one single awk script? Might be clearer, cleaner and easier to maintain.
This User Gave Thanks to RudiC For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

Copy last few lines of a file, perform math operation and iterate further

Hi, I am trying to generate a data of following order: 4 0 1 642 643 4 642 643 1283 1284 4 1283 1284 1924 1925 4 1924 1925 2565 2566 4 2565 2566 3206 3207 4 3206 3207 3847 3848 4 3847 3848 4488 4489 4 4488 4489 5129 5130 ---------------------- 4 1 2 643 644 4 643 644 1284... (6 Replies)
Discussion started by: SaPa
6 Replies

2. 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

3. Shell Programming and Scripting

awk --> math-operation in data-record and joining with second file data

Hi! I have a pretty complex job - at least for me! i have two csv-files with meassurement-data: fileA ...... (2 Replies)
Discussion started by: IMPe
2 Replies

4. Shell Programming and Scripting

awk in horizontal and vertical math

Based on input ail,UTT,id1_0,COMBO,21,24,21,19,85 al,UTHAST,id1_0,COMBO,342,390,361,361,1454 and awk code as awk -F, '{ K=0; for(i=NF; i>=(NF-4); i--) { K=K+$i; J=J+$i;} { print K } } END { for ( l in J ) printf("%s ",J); }' I'm trying to add columns and lines in single line. line... (6 Replies)
Discussion started by: busyboy
6 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

Grab data between 2 keywords any do an array operation and write the file intact

Hi Unix Gurus, I need to grep for a block that is between a start and end keyword and then in between I need to find and replace a keyword. for eg: I need to search between Test = 000; and Test = 000; and find K9 and replace with M9 INPUT FILE Define { Replace = K9; Test =... (6 Replies)
Discussion started by: naveen@
6 Replies

7. 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

8. 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

9. 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

10. Shell Programming and Scripting

Array operation

Hi, I would like ask for you help for coding array operation. array= ( a b c d e f ) I would like to remove entry "d" from my array and import the remaining entries back to the array. Thanks. (3 Replies)
Discussion started by: phamp008
3 Replies
Login or Register to Ask a Question