.TH AWK 1 .SH NAME awk \- pattern-directed scanning and processing language .SH SYNOPSIS .B awk [ .BI \-F s ] [ prog ] [ file ] ... .SH DESCRIPTION .I awk scans each input .I file for lines that match any of a set of patterns specified literally in .IR prog or in a file specified as .B \-f .IR file . With each pattern there can be an associated action that will be performed when a line of a .I file matches the pattern. Each line is matched against the pattern portion of every pattern-action statement; the associated action is performed for each matched pattern. The file name `\-' means the standard input. .PP An input line is made up of fields separated by white space. (This default can be changed by using FS, .IR "vide infra" ".)" The fields are denoted $1, $2, ... ; $0 refers to the entire line. .PP A pattern-action statement has the form .PP pattern { action } .PP A missing { action } means print the line; a missing pattern always matches. .PP An action is a sequence of statements. A statement can be one of the following: .PP .nf if ( conditional ) statement [ else statement ] while ( conditional ) statement for ( expression ; conditional ; expression ) statement for ( var in array ) statement break continue { [ statement ] ... } expression # commonly variable = expression print [ expression-list ] [ >expression ] printf format [ , expression-list ] [ >expression ] next # skip remaining patterns on this input line exit [expr] # skip the rest of the input; exit status is expr .fi .PP Statements are terminated by semicolons, newlines or right braces. An empty expression-list stands for the whole line. Expressions take on string or numeric values as appropriate, and are built using the operators +, \-, *, /, %, ^ (exponentiation), and concatenation (indicated by a blank). The C operators ++, \-\-, +=, \-=, *=, /=, %= and ^= are also available in expressions. Variables may be scalars, array elements (denoted x[i]) or fields. Variables are initialized to the null string. Array subscripts may be any string, not necessarily numeric; this allows for a form of associative memory. String constants are quoted "...". .PP The .I print statement prints its arguments on the standard output (or on a file if .I >file is present or on a pipe if .I \(orcmd is present), separated by the current output field separator, and terminated by the output record separator. The .I printf statement formats its expression list according to the format (see .IR printf (3)). The function .I close closes the file or pipe named as its argument. .PP The built-in function .I length returns the length of its argument taken as a string, or of the whole line if no argument. There are also built-in functions .IR exp , .IR log , .IR sqrt , .IR sin , .IR cos , .IR atan2 , .I rand (returns a random number on (0,1)), .IR srand (sets seed for .IR rand ), and .IR int (truncates its argument to an integer). .IR substr(s,\ m,\ n) returns the .IR n -character substring of .I s that begins at position .IR m . .I index(s,\ t) returns the position in .I s where .I t occurs, or 0 if it does not. The function .I split(s,\ a,\ fs) splits the string .I s into array elements .IR a[1] , .IR a[2] , \&..., .IR a[n] , and returns .IR n . The separation is done with the regular expression .I fs or with the field separator FS if .I fs is not given. .PP The function .I sub(r,\ t,\ s) substitutes .I t for the first occurrence of the regular expression .I r in the string .IR s . If .I s is not given, $0 is used. The function .I gsub is the same except that all occurrences of the regular expression are replaced. .I Sub and .I gsub return the number of replacements. .PP The function .IR sprintf(fmt,\ expr,\ expr,\ ...) formats the expressions according to the .IR printf (3) format given by .I fmt and returns the resulting string. .PP The function .I system(cmd) executes .I cmd and returns its exit status The function .I getline sets $0 to the next input record from the current input file; .I getline .I 72 .fi .PP Print first two fields in opposite order: .PP .nf { print $2, $1 } .fi .PP Same, with input fields separated by comma and/or blanks and tabs: .nf BEGIN { FS = ",[ \et]*\(or[ \et]+" } { print $2, $1 } .PP Add up first column, print sum and average: .PP .nf { s += $1 } END { print "sum is", s, " average is", s/NR } .fi .PP Print all lines between start/stop pairs: .PP .nf /start/, /stop/ .fi .PP Simulate .IR echo (1): .PP .nf BEGIN { for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i] printf "\en" exit } .fi .SH SEE ALSO lex(1), sed(1), sno(1) .br A. V. Aho, B. W. Kernighan, P. J. Weinberger, .I Awk \- a pattern scanning and processing language: user's manual .SH BUGS There are no explicit conversions between numbers and strings. To force an expression to be treated as a number add 0 to it; to force it to be treated as a string concatenate "" to it. .PP The scope rules for variables in functions are a botch.