# mawk

Implementation of programming language AWK

mawk is AWK interpreter written in C by Mike Brennan. It is considered to be the most efficient implementation of AWK and is system default on Ubuntu/Debian Linux.

mawk implements POSIX 1003.2 standard of the language and has a number of useful extensions.

## Examples:

### Hello, World!:

Example for versions Jawk 1.02, gawk 3.1.6, mawk 1.3.3

The printing is done with `BEGIN` pattern, i.e., before processing the input.

``````BEGIN { print "Hello, World!" }
``````

### Factorial:

Example for versions Jawk 1.02, gawk 3.1.6, mawk 1.3.3

This example uses iterative factorial definition. Individual statements within code block can be separated with semicolons (`;`) or new lines.

``````BEGIN {
f = 1
print "0! = " f
for (i=1; i<17; i++) {
f *= i
print i "! = " f
}
}
``````

### Fibonacci numbers:

Example for versions Jawk 1.02, gawk 3.1.6, mawk 1.3.3

This example uses iterative definition of Fibonacci numbers. `fib` is an associative array, and `pr` is a string.

``````BEGIN {
fib = 1
fib = 1
for (i=3; i<17; i++)
fib[i] = fib[i-1]+fib[i-2]
pr = ""
for (i=1; i<17; i++)
pr = pr fib[i] ", "
print pr "..."
}
``````

Example for versions Jawk 1.02, gawk 3.1.6, mawk 1.3.3
``````{   A = \$1
B = \$2
C = \$3
if (A == 0)
print "Not a quadratic equation"
else
{   D = B*B-4*A*C
if (D == 0)
print "x = " (-B/2/A)
else if (D > 0)
{   print "x1 = " ((-B+sqrt(D))/2/A)
print "x2 = " ((-B-sqrt(D))/2/A)
}
else
{   print "x1 = (" (-B/2/A) "," (sqrt(-D)/2/A) ")"
print "x2 = (" (-B/2/A) "," (-sqrt(-D)/2/A) ")"
}
}
}
``````

### CamelCase:

Example for versions Jawk 1.02, gawk 3.1.6, mawk 1.3.3

mawk provides no function `length` to get the size of the array, neither it can be used in Jawk — an attempt results in “Cannot evaluate an unindexed array.” runtime error.

Instead we can use the fact that function `split` returns the number of string fragments it extracted from the string. Otherwise this example is identical to this one.

``````{   text = \$0;
N = split(text, words, /[^a-zA-Z]+/);
for (i=1; i<=N; i++) {
res = res toupper(substr(words[i],1,1)) tolower(substr(words[i],2));
}
print res
}
``````