Sponsored Content
Top Forums Shell Programming and Scripting Trying to learn to use functions in gawk and not getting expected output. Post 302842833 by DeCoTwc on Saturday 10th of August 2013 02:40:13 PM
Old 08-10-2013
Trying to learn to use functions in gawk and not getting expected output.

I've been working on improving my awk, and the next thing I want to learn is to properly use functions (I understand functions in shell and python). I have the following code which includes how I did this without functions before, and two attempts I've made to do it with functions:

Code:
function div(n, d)
{
  if (n == 0) {
  	return n
  } else {
  	return substr(n / d * 100, 0, 5)
  }
}

BEGIN{ 
    OFS=",";SUBSEP=","
     }
      $7   == 17018      {SETUP[$1,substr($2,0,2)]++ ; DT[$1,substr($2,0,2)]++ }
      $7   == 17030      { SUCC[$1,substr($2,0,2)]++ ; DT[$1,substr($2,0,2)]++ }
      $7   == 17120      {  FWD[$1,substr($2,0,2)]++ ; DT[$1,substr($2,0,2)]++ ; SETUP[$1,substr($2,0,2)]-- }
      $7   == 17014      { TIME[$1,substr($2,0,2)]++ ; DT[$1,substr($2,0,2)]++ ;  SUCC[$1,substr($2,0,2)]-- }
      $19  == "(Missing" { MISS[$1,substr($2,0,2)]++ ; DT[$1,substr($2,0,2)]++ }
END{
    for (X in DT)
    #print X,SETUP[X]+0,SUCC[X]+0,substr(SUCC[X]/SETUP[X]*100,0,5),FWD[X]+0,TIME[X]+0,MISS[X]+0 #Old way ->  Works
    perc = div(SUCC[X],SETUP[X]) #New Way  
    print X,SETUP[X]+0,SUCC[X]+0,perc,FWD[X]+0,TIME[X]+0,MISS[X]+0 #New Way  -> doesn't work

   }

Below is the output I get with both:

Code:
[root@decobox utils]# cat /opt/decobox/logs/manager.log|awk -f test.streamReport.awk|sort -M #Old way works, and gives full report
08/10/13,01,542,536,98.89,361,0,0
08/10/13,02,330,327,99.09,210,0,0
08/10/13,03,235,232,98.72,104,0,0
08/10/13,04,181,181,100,94,0,0
08/10/13,05,180,179,99.44,104,0,1
08/10/13,06,322,320,99.37,181,1,1
08/10/13,07,475,468,98.52,344,0,1
08/10/13,08,671,663,98.80,436,0,2
08/10/13,09,745,734,98.52,401,3,5
08/10/13,10,773,761,98.44,398,0,2
08/10/13,11,717,713,99.44,397,0,4
08/10/13,12,783,764,97.57,447,7,5
08/10/13,13,719,694,96.52,450,1,7
08/10/13,14,393,379,96.43,191,8,5
[root@decobox utils]# vim test.streamReport.awk
[root@decobox utils]# cat /opt/decobox/logs/manager.log|awk -f test.streamReport.awk|sort -M #New way only gives one line of output
08/10/13,06,322,320,99.37,181,1,1

I can't seem to figure out why this isn't working. I'm sure it's something simple, but I'm at a loss here.

Somewhat as an aside, how does my code look here? Is there anything obviously wrong, or things I could be doing better? I'm not sure that returning a value from a function instead of printing it is preferred in awk, but when I tried getting it to work by printing things out, it broke completely.
 

10 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

GAWK removes FS | on output

I have the simple gawk script below. When the script runs in the output of all the ITM lines the FS is replaced with a space, the Non ITM lines retain the | field separator. The ITM lines have many fields and I can't insert "|" between each field because some of the fields are blank. Is... (1 Reply)
Discussion started by: paulr211
1 Replies

2. Shell Programming and Scripting

awk not generating the expected output

Hi, I am presently stuck in a csv file. INPUT CSV baseball,NULL,8798765,Most played baseball,NULL,8928192,Most played baseball,NULL,5678945,Most played cricket,NOTNULL,125782,Usually played cricket,NOTNULL,678921,Usually played EXPECTED OUTPUT CSV ... (7 Replies)
Discussion started by: scripter12
7 Replies

3. Shell Programming and Scripting

Output is not comming as expected

Hi All, I am in middle of one script. I want output in the form of xls file. There are 4 fields - user name, email Id, full name, date of birth. I want these details to get in seperate columns. But, i am getting it in the single cell and as like a paragraph.:mad: Please suggest me some... (8 Replies)
Discussion started by: Agupte
8 Replies

4. Shell Programming and Scripting

Not getting expected output

Hi I have written below script to get the data in table form. #!/bin/sh echo "File Name\tType" for i in *; do echo "$i\t\c" if ; then echo "directory" elif ; then echo "symbolic link" elif ; then echo "file" else echo "unknown" fi donehowever i am getting output in different way... (3 Replies)
Discussion started by: scriptor
3 Replies

5. Shell Programming and Scripting

Gawk output difference

Why the below option2 doesn't fetch similar output as option1 ? I am on linux. $cat test 2013-01-01-00.25.43.643845 Option1: cat test | gawk -F"-" ' {print $2 " " $3 " " $1}' 01 01 2013 Option2: cat test | gawk '{FS="-"} {print $2 " " $3 " " $1}' 2013-01-01-00.25.43.643845 (5 Replies)
Discussion started by: Shivdatta
5 Replies

6. Shell Programming and Scripting

Local variable in functions (gawk)

Hi Everybody :) I need your help, because i know a local variable in a function for example k, it is different of other variable(with the same name k) this a global variable. Is that right? dgawk> run Starting program: 3238860128818202 3 4 7 11 12 13 17 22 23 32 35 37 41 48 49 55 63 ... (5 Replies)
Discussion started by: solaris21
5 Replies

7. Shell Programming and Scripting

awk output not what was expected

Good Moring, I am currently reading about awk in a manual and following the examples using the oratab file. My system is SOLARIS 10 I think I am getting strange behavior judging by what the book says to do and what I am getting with my little program. Here is my program: grep -v oratab |... (4 Replies)
Discussion started by: bdby
4 Replies

8. Shell Programming and Scripting

Gawk output separated by tab

In the gawk below, I am trying to output the file tab-deliminated but don't think that is the correct syntax. Thank you :). gawk OFS='/t' '{sub(/-+/,"",$2); ar=$0} END{n = asort(ar) for (i = 1; i <= n; i++) print ar}' file (2 Replies)
Discussion started by: cmccabe
2 Replies

9. Shell Programming and Scripting

For loop not giving expected output

#cat /tmp/input old_array old_dev new_dev new_array 0577 008AB 01744 0125 0577 008AC 01745 0125 0577 008AD 005C8 0125 0577 008AE 005C9 0125 0577 008AF 005CA 0125 0577 008B0 005CB 0125 0577 008B1 005CC 0125 cat test.sh #!/bin/ksh... (4 Replies)
Discussion started by: mbak
4 Replies

10. Shell Programming and Scripting

awk not giving the output expected

Hello, I am practising awk and decided to compare two columns and print the result of the comparison as third column i/p data c1,c2,c3 1,a,b 1,b,b i am trying to compare the last two columns and if they match I am trying to print match else mismatch(Ideally i want that as a last column... (5 Replies)
Discussion started by: mkathi
5 Replies
bytes(3pm)                                               Perl Programmers Reference Guide                                               bytes(3pm)

NAME
bytes - Perl pragma to force byte semantics rather than character semantics NOTICE
This pragma reflects early attempts to incorporate Unicode into perl and has since been superseded. It breaks encapsulation (i.e. it exposes the innards of how the perl executable currently happens to store a string), and use of this module for anything other than debugging purposes is strongly discouraged. If you feel that the functions here within might be useful for your application, this possibly indicates a mismatch between your mental model of Perl Unicode and the current reality. In that case, you may wish to read some of the perl Unicode documentation: perluniintro, perlunitut, perlunifaq and perlunicode. SYNOPSIS
use bytes; ... chr(...); # or bytes::chr ... index(...); # or bytes::index ... length(...); # or bytes::length ... ord(...); # or bytes::ord ... rindex(...); # or bytes::rindex ... substr(...); # or bytes::substr no bytes; DESCRIPTION
The "use bytes" pragma disables character semantics for the rest of the lexical scope in which it appears. "no bytes" can be used to reverse the effect of "use bytes" within the current lexical scope. Perl normally assumes character semantics in the presence of character data (i.e. data that has come from a source that has been marked as being of a particular character encoding). When "use bytes" is in effect, the encoding is temporarily ignored, and each string is treated as a series of bytes. As an example, when Perl sees "$x = chr(400)", it encodes the character in UTF-8 and stores it in $x. Then it is marked as character data, so, for instance, "length $x" returns 1. However, in the scope of the "bytes" pragma, $x is treated as a series of bytes - the bytes that make up the UTF8 encoding - and "length $x" returns 2: $x = chr(400); print "Length is ", length $x, " "; # "Length is 1" printf "Contents are %vd ", $x; # "Contents are 400" { use bytes; # or "require bytes; bytes::length()" print "Length is ", length $x, " "; # "Length is 2" printf "Contents are %vd ", $x; # "Contents are 198.144" } chr(), ord(), substr(), index() and rindex() behave similarly. For more on the implications and differences between character semantics and byte semantics, see perluniintro and perlunicode. LIMITATIONS
bytes::substr() does not work as an lvalue(). SEE ALSO
perluniintro, perlunicode, utf8 perl v5.12.1 2010-04-26 bytes(3pm)
All times are GMT -4. The time now is 09:30 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy