csci 330 unix and network programming unit ix: awk ii

30
CSCI 330 UNIX and Network Programming Unit IX: awk II

Upload: alisha-martin

Post on 19-Jan-2018

240 views

Category:

Documents


2 download

DESCRIPTION

Typical awk script divided into three major parts: comment lines start with # 3CSCI 330 – UNIX and Network Programming

TRANSCRIPT

Page 1: CSCI 330 UNIX and Network Programming Unit IX: awk II

CSCI 330UNIX and Network Programming

Unit IX: awk II

Page 2: CSCI 330 UNIX and Network Programming Unit IX: awk II

2

What can you do with awk?• awk operation:

• scans a file line by line • splits each input line into fields• compares input line/fields to pattern• performs action(s) on matched lines

• Useful for:• transform data files• produce formatted reports

• Programming constructs:• format output lines• arithmetic and string operations• conditionals and loops

CSCI 330 – UNIX and Network Programming

Page 3: CSCI 330 UNIX and Network Programming Unit IX: awk II

3

Typical awk script• divided into three major parts:

• comment lines start with #

CSCI 330 – UNIX and Network Programming

Page 4: CSCI 330 UNIX and Network Programming Unit IX: awk II

4

awk Array• awk allows one-dimensional arrays

• index can be number or string• elements can be string or number

• array need not be declared• its size• its element type

• array elements are created when first used• initialized to 0 or “”

CSCI 330 – UNIX and Network Programming

Page 5: CSCI 330 UNIX and Network Programming Unit IX: awk II

5

Arrays in awkSyntax:arrayName[index] = value

Examples:list[1] = "some value"list[2] = 123

list["other"] = "oh my !"

CSCI 330 – UNIX and Network Programming

Page 6: CSCI 330 UNIX and Network Programming Unit IX: awk II

6

Illustration: Associative Arrays• awk array allows string as index

Age["Robert"] = 46Age["George"] = 22Age["Juan"] = 22Age["Nhan"] = 19Age["Jonie"] = 34

CSCI 330 – UNIX and Network Programming

Page 7: CSCI 330 UNIX and Network Programming Unit IX: awk II

Example: process sales data• input file:

1 clothing 31411 computers 91611 textbooks 213212 clothing 32522 computers 123212 supplies 22422 textbooks 15462

• desired output:summary of department sales

7CSCI 330 – UNIX and Network Programming

Page 8: CSCI 330 UNIX and Network Programming Unit IX: awk II

8

Illustration: process each input linedeptSales array

CSCI 330 – UNIX and Network Programming

Page 9: CSCI 330 UNIX and Network Programming Unit IX: awk II

9

Illustration: process each input lineCSCI 330 – UNIX and Network Programming

Page 10: CSCI 330 UNIX and Network Programming Unit IX: awk II

10

Summary: awk programCSCI 330 – UNIX and Network Programming

Page 11: CSCI 330 UNIX and Network Programming Unit IX: awk II

11

Example: complete program{

deptSales[$2] += $3}END { for (x in deptSales) print x, deptSales[x]}

CSCI 330 – UNIX and Network Programming

Page 12: CSCI 330 UNIX and Network Programming Unit IX: awk II

awk built-in functions• arithmetic

ex.: sqrt, rand• string

ex.: index, length, split, substr sprintf, tolower, toupper

• misc.ex.: system, systime

12CSCI 330 – UNIX and Network Programming

Page 13: CSCI 330 UNIX and Network Programming Unit IX: awk II

13

awk built-in split functionsplit(string, array, fieldsep) • divides string into pieces separated by fieldsep• stores the pieces in array • if fieldsep is omitted, the value of FS is used

Example: split("26:Miller:Comedian", fields, ":") • sets the contents of the array fields as follows:

fields[1] = "26" fields[2] = "Miller" fields[3] = "Comedian"

CSCI 330 – UNIX and Network Programming

Page 14: CSCI 330 UNIX and Network Programming Unit IX: awk II

14

awk control structures• Conditional

• if-else• Repetition

• for• with counter• with array index

• whilealso: break, continue

CSCI 330 – UNIX and Network Programming

Page 15: CSCI 330 UNIX and Network Programming Unit IX: awk II

15

if StatementSyntax:if (conditional expression)statement-1

elsestatement-2

Example:if ( NR < 3 )print $2

elseprint $3

• Use compound { } for more than one statement:

{ … … }

CSCI 330 – UNIX and Network Programming

Page 16: CSCI 330 UNIX and Network Programming Unit IX: awk II

if Statement for arraysSyntax:if (value in array)statement-1

elsestatement-2

Example:if ("clothing" in deptSales)print deptSales["clothing"]

elseprint "not found"

16CSCI 330 – UNIX and Network Programming

Page 17: CSCI 330 UNIX and Network Programming Unit IX: awk II

17

for LoopSyntax:for (initialization; limit-test; update) statement

Example:for (i=1; i <= 10; i++) print "The square of ", i, " is ", i*i

CSCI 330 – UNIX and Network Programming

Page 18: CSCI 330 UNIX and Network Programming Unit IX: awk II

18

for Loop for arraysSyntax:for (var in array) statement

Example:for (x in deptSales) { print x print deptSales[x]}

CSCI 330 – UNIX and Network Programming

Page 19: CSCI 330 UNIX and Network Programming Unit IX: awk II

19

while LoopSyntax:while (logical expression) statement

Example:i=1 while (i <= 10) { print "The square of ", i, " is ", i*i i = i+1 }

CSCI 330 – UNIX and Network Programming

Page 20: CSCI 330 UNIX and Network Programming Unit IX: awk II

20

loop control statements• break

exits loop

• continueskips rest of current iteration, continues with next iteration

CSCI 330 – UNIX and Network Programming

Page 21: CSCI 330 UNIX and Network Programming Unit IX: awk II

21

Example: sensor data1 Temperature2 Rainfall3 Snowfall4 Windspeed 5 Winddirection

• also: sensor readings

• Plan: print report with average readings per sensor

CSCI 330 – UNIX and Network Programming

Page 22: CSCI 330 UNIX and Network Programming Unit IX: awk II

22

Example: sensor readings2012-10-01/1/68 2012-10-02/2/6 2011-10-03/3/4 2012-10-04/4/25 2012-10-05/5/120 2012-10-01/1/89 2011-10-01/4/35 2012-11-01/5/360 2012-10-01/1/45 2011-12-01/1/61 2012-10-10/1/32

CSCI 330 – UNIX and Network Programming

Page 23: CSCI 330 UNIX and Network Programming Unit IX: awk II

23

Report: average readings Sensor Average----------------------- Windspeed 30.00 Winddirection 240.00 Temperature 59.00 Rainfall 6.00 Snowfall 4.00

CSCI 330 – UNIX and Network Programming

Page 24: CSCI 330 UNIX and Network Programming Unit IX: awk II

24

Step 1: print sensor dataBEGIN { printf("id\tSensor\n") printf("----------------------\n") } { printf("%d\t%s\n", $1, $2)}

CSCI 330 – UNIX and Network Programming

Page 25: CSCI 330 UNIX and Network Programming Unit IX: awk II

25

Step 2: print sensor readingsBEGIN { FS="/" printf(" Date Value\n") printf("---------------------\n")}{ printf("%s %7.2f\n", $1, $3)}

CSCI 330 – UNIX and Network Programming

Page 26: CSCI 330 UNIX and Network Programming Unit IX: awk II

26

Step 3: print sensor summaryBEGIN { FS="/" }{ sum[$2] += $3 count[$2]++ } END { for (i in sum) printf("%d %7.2f\n", i, sum[i]/count[i]) }

CSCI 330 – UNIX and Network Programming

Page 27: CSCI 330 UNIX and Network Programming Unit IX: awk II

27

Next steps: Remaining tasks • awk -f sense.awk sensors readings

Sensor Average----------------------- Windspeed 30.00 Winddirection 240.00 Temperature 59.00 Rainfall 6.00 Snowfall 4.00

sensor names

2 input files

CSCI 330 – UNIX and Network Programming

Page 28: CSCI 330 UNIX and Network Programming Unit IX: awk II

28

Example: print sensor averages• Remaining tasks:

• recognize nature of input datause: number of fields in record

• substitute sensor id with sensor nameuse: array of sensor names

CSCI 330 – UNIX and Network Programming

Page 29: CSCI 330 UNIX and Network Programming Unit IX: awk II

29

Example: sense.awkBEGIN { print " Sensor Average" print "-----------------------"}NF > 1 { name[$1] = $2}NF < 2 { split($0,fields,"/") sum[fields[2]] += fields[3] count[fields[2]]++}END { for (i in sum) printf("%15s %7.2f\n", name[i], sum[i]/count[i])}

CSCI 330 – UNIX and Network Programming

Page 30: CSCI 330 UNIX and Network Programming Unit IX: awk II

30

Summary• awk

• similar in operation to sed• transform input lines to output lines

• powerful report generator

CSCI 330 – UNIX and Network Programming