Begin/End blocks in awk: confused


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Begin/End blocks in awk: confused
# 1  
Old 01-06-2014
Begin/End blocks in awk: confused

I am trying to understand how to use the END block in awk without much success. I have this script that I found:

Code:
gawk '{count[$2]++; keyword[$2] = $1}
if (count[k] == 3) keyword[k] = "order this"
else print keyword[k] " " k
}
}' << orderfile

Is that the way that the END block should be used? I am confused; I thought that the Begin block went at the beginning of the scripts. Any one have an example of how BEGIN could be used here? Or does END only apply? I thought BEGIN was when the input was being read.
# 2  
Old 01-06-2014
No. Begin and End blocks in awk are meant to be used before and after all lines are processes; repectively, and appear as follow in awk script..

Code:
BEGIN{do something}
more awk script
END{do something}

I suggest you call gawk in this fashion until you are comfortable with awk/gawk...


Code:
gawk -f awk.script.txt  file.to.parse.txt

awk is arguably a 4GL language since every line of the file to be parsed is passed by each line of the awk script, with the exception of awk script in beginning and end sections. Again, Begin is processed before every line and END after the processing of every line. The Begin section is useful for printing headers or initializing counters. The End section is useful for performing end calculations, etc.

T
# 3  
Old 01-06-2014
End where Begin is?

So would you use BEGIN/END like this?
Code:
 gawk '{count[$2]++; keyword[$2] = $1}
 END {
       # look at every count we have gotten.  k will be order
       for (k in count)
    if (count[k] == 3) keyword[k] = "order this"
else print keyword[k] " " k
}
}' << orderfile

Or would BEGIN be there? The script I have shows END in the beginning.
# 4  
Old 01-06-2014
Well, you can have several of each; following would be perfectly legitimate:
Code:
awk 'END {print "4"} BEGIN {print "3"} END {print "7"} BEGIN {print "6"}'

And, what you propose above is fine, although be aware that the order in which (x in Y) supplies the xs is undefined (awk feature).
# 5  
Old 01-06-2014
As this script is not mine, I am curious as to why this would be included in the END part

Code:
END {
for (k in count)
    if (count[k] == 3) keyword[k] = "order this"
else print keyword[k] " " k = "order this"

I don't understand the rules for what you put in this END/BEGIN block or why. I always believed it was invoked when you were printing headers or footers, but it appears from the above that is only part of the use. Does someone have any example? I have searched but there are many and I am not sure about this rule.
# 6  
Old 01-06-2014
awk takes a set of files as arguments, which altogether present a stream of lines to it. Line after line is processed, with the internal FILENAME variable changing if need be (if switching to the next file).
Before any of the lines of the stream is read, ALL of the BEGIN actions are being processed. You can use this to initialize variables, print headers, what have you.
After the last line of the entire stream, possibly consisting of many a file, ALL the END actions will be processed, e.g. for printing totals. That means, you can calculate your count[$2]++ during normal processing, and at the END, print out (in whatever structure) what you have computed so far.
And it looks to me as if that's exactly what that code snippet you presented is doing...
# 7  
Old 01-06-2014
Begin and End blocks are optional. In this case, END is not at the beginning, it is at the end. The thing that is probably confusing you is because of the manner this is being run. The awk script is being specified inline (as opposed to using the -f switch to specify an awk script file).

Here is the start of the awk code

Code:
{count[$2]++; keyword[$2] = $1}

The end follows that. So there is no BEGIN section. This means every line of the input file will be processed against that line.
This may help...

At this point, I suggest reading awk and looking at examples.
Basic ways to call awk...

Code:
awk 'instructions' file.to.parse.txt
awk -f awkscript.awk file.to.parse.txt

This User Gave Thanks to blackrageous For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

In ksh script what is this BEGIN and END in this function?

Can Someone please explain why BEGIN and END statement is used inside function? How does that help in scripting? function fileformatting { CleanupMask="xXxX" sed 's/^.//' < ${AllFile} > ${AllFile}.tmp echo $(wc -l ${AllFile}.tmp) `awk -v CleanupMask=${CleanupMask} ' BEGIN... (2 Replies)
Discussion started by: later_troy
2 Replies

2. Shell Programming and Scripting

Search ad replace using begin and end of the file

Hello Friends , Please help to create script for compare and replace if not matches of set of lines . * Primary* Servername Server1 Location R201 Rack 4 *End Primary* *Secondary* Server Name Server1 IPAddress 10.24.30.10 Application Apache *End of Secondary* Above... (4 Replies)
Discussion started by: rnary
4 Replies

3. Shell Programming and Scripting

BEGIN and END format in awk

I'm new to awk, trying to understand the basics. I'm trying to reset the counter everytime the program gets a new file to check. I figured in the BEGIN part it would work, but it doesn't. #!/bin/awk -f BEGIN {counter=0} { sum=0 for ( i=1; i<=NF;... (1 Reply)
Discussion started by: guitarist684
1 Replies

4. Shell Programming and Scripting

Get the sum of values in between begin and end in the file

Hi All, test file Begin Script Run at Thu Mar 14 09:24:16 PDT 2013 tst_accounts: ws zip: WS_out_20130313.tar.gz dat: test_20130313.dat count: 63574 loaded: xx pre-merge: xx post-merge: xx timestamp: Thu Mar 14 09:30:42 PDT 2013 tst_accounts: ws zip: WS_out_20130313.tar.gz dat: s_20130313.dat... (6 Replies)
Discussion started by: bmk
6 Replies

5. Shell Programming and Scripting

strange: sed and awk print at end instead of begin of line

Hi! I have a strange behaviour from sed and awk, but I'm not sure, if I'm doing something wrong: I have a list of words, where I want to add the following string at the end of each line: \;\;\;\;0\;1 I try like this: $ cat myfile | awk '{if ( $0 != "" ) print $0"\;\;\;\;0\;1"}' Result:... (5 Replies)
Discussion started by: regisl67
5 Replies

6. UNIX for Dummies Questions & Answers

Dump to another file for a begin and end Pattern

Hi All , I am newbie to linux shell scripting , below are the contents of my log file , i want the lines between a begin pattern and a end pattern for an instance , my begin Pattern is "Transaction Begins for Usr" and end pattern is "Transaction Ends for Usr" into another file Sample file... (1 Reply)
Discussion started by: SARAVANANE
1 Replies

7. Shell Programming and Scripting

Use of Begin IF ,END IF END not working in the sql script

Hi I have written a script .The script runs properly if i write sql queries .But if i use PLSQL commands of BEGIN if end if , end ,then on running the script the comamds are getting printed on the prompt . Ex :temp.sql After connecting to the databse at the sql prompt i type... (1 Reply)
Discussion started by: isha_1
1 Replies

8. Shell Programming and Scripting

awk BEGIN END and string matching problem

Hi, Contents of BBS-list file: foo foo foo awk ' BEGIN { print "Analysis of \"foo\"" } /foo/ { ++n } END { print "\"foo\" appears", n, "times." }' BBS-list Output: Analysis of "foo" "foo" appears 3 times. awk ' (3 Replies)
Discussion started by: cola
3 Replies

9. Shell Programming and Scripting

begin end detection

Hi all, i am new to scripting. i need to write a code to detect begin and end of word that either begins or ends with t,th,d,dh,s,sh i have a set of words in a file containg one word per line. let the filename be aaa.txt. i have an another file bbb.txt which has two lines, just specifying the... (7 Replies)
Discussion started by: blkanth
7 Replies

10. Shell Programming and Scripting

BEGIN END questions

Why would you need to use this in a script? Why can't you just use print to print out what you want printed in the begining and print for what you want at the end. So this: nawk 'BEGIN {print "this is the first line"} {print $1 $2 $3} {print $5 $6} END {print "this is the last line"}' ... (2 Replies)
Discussion started by: llsmr777
2 Replies
Login or Register to Ask a Question