summaryrefslogtreecommitdiff
path: root/gawk-info-3
diff options
context:
space:
mode:
Diffstat (limited to 'gawk-info-3')
-rw-r--r--gawk-info-31385
1 files changed, 0 insertions, 1385 deletions
diff --git a/gawk-info-3 b/gawk-info-3
deleted file mode 100644
index b333f57c..00000000
--- a/gawk-info-3
+++ /dev/null
@@ -1,1385 +0,0 @@
-Info file gawk-info, produced by Makeinfo, -*- Text -*- from input
-file gawk.texinfo.
-
-This file documents `awk', a program that you can use to select
-particular records in a file and perform operations upon them.
-
-Copyright (C) 1989 Free Software Foundation, Inc.
-
-Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided that
-the entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
-Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be stated in a
-translation approved by the Foundation.
-
-
-
-File: gawk-info, Node: Patterns, Next: Actions, Prev: One-liners, Up: Top
-
-Patterns
-********
-
-Patterns control the execution of rules: a rule is executed when its
-pattern matches the input record. The `awk' language provides
-several special patterns that are described in the sections that
-follow. Patterns include:
-
-NULL
- The empty pattern, which matches every input record. (*Note The
- Empty Pattern: Empty.)
-
-/REGULAR EXPRESSION/
- A regular expression as a pattern. It matches when the text of
- the input record fits the regular expression. (*Note Regular
- Expressions as Patterns: Regexp.)
-
-CONDEXP
- A single comparison expression. It matches when it is true.
- (*Note Comparison Expressions as Patterns: Comparison Patterns.)
-
-`BEGIN'
-`END'
- Special patterns to supply start--up or clean--up information to
- `awk'. (*Note Specifying Record Ranges With Patterns: BEGIN/END.)
-
-PAT1, PAT2
- A pair of patterns separated by a comma, specifying a range of
- records. (*Note Specifying Record Ranges With Patterns: Ranges.)
-
-CONDEXP1 BOOLEAN CONDEXP2
- A "compound" pattern, which combines expressions with the
- operators `and', `&&', and `or', `||'. (*Note Boolean
- Operators and Patterns: Boolean.)
-
-! CONDEXP
- The pattern CONDEXP is evaluated. Then the `!' performs a
- boolean ``not'' or logical negation operation; if the input line
- matches the pattern in CONDEXP then the associated action is
- *not* executed. If the input line did not match that pattern,
- then the action *is* executed. (*Note Boolean Operators and
- Patterns: Boolean.)
-
-(EXPR)
- Parentheses may be used to control how operators nest.
-
-PAT1 ? PAT2 : PAT3
- The first pattern is evaluated. If it is true, the input line
- is tested against the second pattern, otherwise it is tested
- against the third. (*Note Conditional Patterns: Conditional
- Patterns.)
-
-* Menu:
-
-The following subsections describe these forms in detail:
-
-* Empty:: The empty pattern, which matches every record.
-
-* Regexp:: Regular expressions such as `/foo/'.
-
-* Comparison Patterns:: Comparison expressions such as `$1 > 10'.
-
-* Boolean:: Combining comparison expressions.
-
-* Ranges:: Using pairs of patterns to specify record ranges.
-
-* BEGIN/END:: Specifying initialization and cleanup rules.
-
-* Conditional Patterns:: Patterns such as `pat1 ? pat2 : pat3'.
-
-
-
-File: gawk-info, Node: Empty, Next: Regexp, Up: Patterns
-
-The Empty Pattern
-=================
-
-An empty pattern is considered to match *every* input record. For
-example, the program:
-
- awk '{ print $1 }' BBS-list
-
-prints just the first field of every record.
-
-
-
-File: gawk-info, Node: Regexp, Next: Comparison Patterns, Prev: Empty, Up: Patterns
-
-Regular Expressions as Patterns
-===============================
-
-A "regular expression", or "regexp", is a way of describing classes
-of strings. When enclosed in slashes (`/'), it makes an `awk'
-pattern that matches every input record that contains a match for the
-regexp.
-
-The simplest regular expression is a sequence of letters, numbers, or
-both. Such a regexp matches any string that contains that sequence.
-Thus, the regexp `foo' matches any string containing `foo'. (More
-complicated regexps let you specify classes of similar strings.)
-
-* Menu:
-
-* Usage: Regexp Usage. How regexps are used in patterns.
-* Operators: Regexp Operators. How to write a regexp.
-
-
-
-File: gawk-info, Node: Regexp Usage, Next: Regexp Operators, Up: Regexp
-
-How to use Regular Expressions
-------------------------------
-
-When you enclose `foo' in slashes, you get a pattern that matches a
-record that contains `foo'. For example, this prints the second
-field of each record that contains `foo' anywhere:
-
- awk '/foo/ { print $2 }' BBS-list
-
-Regular expressions can also be used in comparison expressions. Then
-you can specify the string to match against; it need not be the
-entire current input record. These comparison expressions can be
-used as patterns or in `if' and `while' statements.
-
-`EXP ~ /REGEXP/'
- This is true if the expression EXP (taken as a character string)
- is matched by REGEXP. The following example matches, or
- selects, all input records with the letter `J' in the first field:
-
- awk '$1 ~ /J/' inventory-shipped
-
- So does this:
-
- awk '{ if ($1 ~ /J/) print }' inventory-shipped
-
-`EXP !~ /REGEXP/'
- This is true if the expression EXP (taken as a character string)
- is *not* matched by REGEXP. The following example matches, or
- selects, all input records whose first field *does not* contain
- the letter `J':
-
- awk '$1 !~ /J/' inventory-shipped
-
-The right hand side of a `~' or `!~' operator need not be a constant
-regexp (i.e. a string of characters between `/'s). It can also be
-"computed", or "dynamic". For example:
-
- identifier = "[A-Za-z_][A-Za-z_0-9]+"
- $0 ~ identifier
-
-sets `identifier' to a regexp that describes `awk' variable names,
-and tests if the input record matches this regexp.
-
-A dynamic regexp may actually be any expression. The expression is
-evaluated, and the result is treated as a string that describes a
-regular expression.
-
-
-
-File: gawk-info, Node: Regexp Operators, Prev: Regexp Usage, Up: Regexp
-
-Regular Expression Operators
-----------------------------
-
-You can combine regular expressions with the following characters,
-called "regular expression operators", or "metacharacters", to
-increase the power and versatility of regular expressions. This is a
-table of metacharacters:
-
-`\'
- This is used to suppress the special meaning of a character when
- matching. For example:
-
- \$
-
- matches the character `$'.
-
-`^'
- This matches the beginning of the string or the beginning of a
- line within the string. For example:
-
- ^@chapter
-
- matches the `@chapter' at the beginning of a string, and can be
- used to identify chapter beginnings in Texinfo source files.
-
-`$'
- This is similar to `^', but it matches only at the end of a
- string or the end of a line within the string. For example:
-
- /p$/
-
- as a pattern matches a record that ends with a `p'.
-
-`.'
- This matches any single character except a newline. For example:
-
- .P
-
- matches any single character followed by a `P' in a string.
- Using concatenation we can make regular expressions like `U.A',
- which matches any three--character string that begins with `U'
- and ends with `A'.
-
-`[...]'
- This is called a "character set". It matches any one of a group
- of characters that are enclosed in the square brackets. For
- example:
-
- [MVX]
-
- matches any of the characters `M', `V', or `X' in a string.
-
- Ranges of characters are indicated by using a hyphen between the
- beginning and ending characters, and enclosing the whole thing
- in brackets. For example:
-
- [0-9]
-
- matches any string that contains a digit.
-
- Note that special patterns have to be followed to match the
- characters, `]', `-', and `^' when they are enclosed in the
- square brackets. To match a `]', make it the first character in
- the set. For example:
-
- []d]
-
- matches either `]', or `d'.
-
- To match `-', write it as `--', which is a range containing only
- `-'. You may also make the `-' be the first or last character
- in the set. To match `^', make it any character except the
- first one of a set.
-
-`[^ ...]'
- This is the "complemented character set". The first character
- after the `[' *must* be a `^'. This matches any characters
- *except* those in the square brackets. For example:
-
- [^0-9]
-
- matches any characters that are not digits.
-
-`|'
- This is the "alternation operator" and it is used to specify
- alternatives. For example:
-
- ^P|[0-9]
-
- matches any string that matches either `^P' or `[0-9]'. This
- means it matches any string that contains a digit or starts with
- `P'.
-
-`(...)'
- Parentheses are used for grouping in regular expressions as in
- arithmetic. They can be used to concatenate regular expressions
- containing the alternation operator, `|'.
-
-`*'
- This symbol means that the preceding regular expression is to be
- repeated as many times as possible to find a match. For example:
-
- ph*
-
- applies the `*' symbol to the preceding `h' and looks for
- matches to one `p' followed by any number of `h''s. This will
- also match just `p' if no `h''s are present.
-
- The `*' means repeat the *smallest* possible preceding
- expression in order to find a match. The `awk' language
- processes a `*' by matching as many repetitions as can be found.
- For example:
-
- awk '/\(c[ad][ad]*r x\)/ { print }' sample
-
- matches every record in the input containing a string of the
- form `(car x)', `(cdr x)', `(cadr x)', and so on.
-
-`+'
- This symbol is similar to `*', but the preceding expression must
- be matched at least once. This means that:
-
- wh+y
-
- would match `why' and `whhy' but not `wy', whereas `wh*y' would
- match all three of these strings. And this is a simpler way of
- writing the last `*' example:
-
- awk '/\(c[ad]+r x\)/ { print }' sample
-
-`?'
- This symbol is similar to `*', but the preceding expression can
- be matched once or not at all. For example:
-
- fe?d
-
- will match `fed' or `fd', but nothing else.
-
-In regular expressions, the `*', `+', and `?' operators have the
-highest precedence, followed by concatenation, and finally by `|'.
-As in arithmetic, parentheses can change how operators are grouped.
-
-Any other character stands for itself. However, it is important to
-note that case in regular expressions *is* significant, both when
-matching ordinary (i.e. non--metacharacter) characters, and inside
-character sets. Thus a `w' in a regular expression matches only a
-lower case `w' and not either an uppercase or lowercase `w'. When
-you want to do a case--independent match, you have to use a character
-set: `[Ww]'.
-
-
-
-File: gawk-info, Node: Comparison Patterns, Next: Ranges, Prev: Regexp, Up: Patterns
-
-Comparison Expressions as Patterns
-==================================
-
-"Comparison patterns" use "relational operators" to compare strings
-or numbers. The relational operators are the same as in C. Here is
-a table of them:
-
-`X < Y'
- True if X is less than Y.
-
-`X <= Y'
- True if X is less than or equal to Y.
-
-`X > Y'
- True if X is greater than Y.
-
-`X >= Y'
- True if X is greater than or equal to Y.
-
-`X == Y'
- True if X is equal to Y.
-
-`X != Y'
- True if X is not equal to Y.
-
-Comparison expressions can be used as patterns to control whether a
-rule is executed. The expression is evaluated for each input record
-read, and the pattern is considered matched if the condition is "true".
-
-The operands of a relational operator are compared as numbers if they
-are both numbers. Otherwise they are converted to, and compared as,
-strings (*note Conversion::.). Strings are compared by comparing the
-first character of each, then the second character of each, and so on.
-Thus, `"10"' is less than `"9"'.
-
-The following example prints the second field of each input record
-whose first field is precisely `foo'.
-
- awk '$1 == "foo" { print $2 }' BBS-list
-
-Contrast this with the following regular expression match, which
-would accept any record with a first field that contains `foo':
-
- awk '$1 ~ "foo" { print $2 }' BBS-list
-
-
-
-File: gawk-info, Node: Ranges, Next: BEGIN/END, Prev: Comparison Patterns, Up: Patterns
-
-Specifying Record Ranges With Patterns
-======================================
-
-A "range pattern" is made of two patterns separated by a comma:
-`BEGPAT, ENDPAT'. It matches ranges of consecutive input records.
-The first pattern BEGPAT controls where the range begins, and the
-second one ENDPAT controls where it ends.
-
-They work as follows: BEGPAT is matched against every input record;
-when a record matches BEGPAT, the range pattern becomes "turned on".
-The range pattern matches this record. As long as it stays turned
-on, it automatically matches every input record read. But meanwhile,
-ENDPAT is matched against every input record, and when it matches,
-the range pattern is turned off again for the following record. Now
-we go back to checking BEGPAT against each record. For example:
-
- awk '$1 == "on", $1 == "off"'
-
-prints every record between on/off pairs, inclusive.
-
-The record that turns on the range pattern and the one that turns it
-off both match the range pattern. If you don't want to operate on
-these records, you can write `if' statements in the rule's action to
-distinguish them.
-
-It is possible for a pattern to be turned both on and off by the same
-record, if both conditions are satisfied by that record. Then the
-action is executed for just that record.
-
-
-
-File: gawk-info, Node: BEGIN/END, Next: Boolean, Prev: Ranges, Up: Patterns
-
-`BEGIN' and `END' Special Patterns
-==================================
-
-`BEGIN' and `END' are special patterns. They are not used to match
-input records. Rather, they are used for supplying start--up or
-clean--up information to your `awk' script. A `BEGIN' rule is
-executed, once, before the first input record has been read. An
-`END' rule is executed, once, after all the input has been read. For
-example:
-
- awk 'BEGIN { print "Analysis of ``foo'' program" }
- /foo/ { ++foobar }
- END { print "``foo'' appears " foobar " times." }' BBS-list
-
-This program finds out how many times the string `foo' appears in the
-input file `BBS-list'. The `BEGIN' pattern prints out a title for
-the report. There is no need to use the `BEGIN' pattern to
-initialize the counter `foobar' to zero, as `awk' does this for us
-automatically (*note Variables::.). The second rule increments the
-variable `foobar' every time a record containing the pattern `foo' is
-read. The last rule prints out the value of `foobar' at the end of
-the run.
-
-The special patterns `BEGIN' and `END' do not combine with other
-kinds of patterns.
-
-An `awk' program may have multiple `BEGIN' and/or `END' rules. The
-contents of multiple `BEGIN' or `END' rules are treated as if they
-had been enclosed in a single rule, in the order that the rules are
-encountered in the `awk' program. (This feature was introduced with
-the new version of `awk'.)
-
-Multiple `BEGIN' and `END' sections are also useful for writing
-library functions that need to do initialization and/or cleanup of
-their own. Note that the order in which library functions are named
-on the command line will affect the order in which their `BEGIN' and
-`END' rules will be executed. Therefore you have to be careful how
-you write your library functions. (*Note Command Line::, for more
-information on using library functions.)
-
-If an `awk' program only has a `BEGIN' rule, and no other rules, then
-the program will exit after the `BEGIN' rule has been run. Older
-versions of `awk' used to read their input until end of file was
-seen. However, if an `END' rule exists as well, then the input will
-be read, even if there are no other rules in the program.
-
-`BEGIN' and `END' rules must have actions; there is no default action
-for these rules since there is no current record when they run.
-
-
-
-File: gawk-info, Node: Boolean, Next: Conditional Patterns, Prev: BEGIN/END, Up: Patterns
-
-Boolean Operators and Patterns
-==============================
-
-A boolean pattern is a combination of other patterns using the
-boolean operators ``or'' (`||'), ``and'' (`&&'), and ``not'' (`!'),
-along with parentheses to control nesting. Whether the boolean
-pattern matches an input record is computed from whether its
-subpatterns match.
-
-The subpatterns of a boolean pattern can be regular expressions,
-matching expressions, comparisons, or other boolean combinations of
-such. Range patterns cannot appear inside boolean operators, since
-they don't make sense for classifying a single record, and neither
-can the special patterns `BEGIN' and `END', which never match any
-input record.
-
-Here are descriptions of the three boolean operators.
-
-`PAT1 && PAT2'
- Matches if both PAT1 and PAT2 match by themselves. For example,
- the following command prints all records in the input file
- `BBS-list' that contain both `2400' and `foo'.
-
- awk '/2400/ && /foo/' BBS-list
-
- Whether PAT2 matches is tested only if PAT1 succeeds. This can
- make a difference when PAT2 contains expressions that have side
- effects: in the case of `/foo/ && ($2 == bar++)', the variable
- `bar' is not incremented if there is no `foo' in the record.
-
-`PAT1 || PAT2'
- Matches if at least one of PAT1 and PAT2 matches the current
- input record. For example, the following command prints all
- records in the input file `BBS-list' that contain *either*
- `2400' or `foo', or both.
-
- awk '/2400/ || /foo/' BBS-list
-
- Whether PAT2 matches is tested only if PAT1 fails to match.
- This can make a difference when PAT2 contains expressions that
- have side effects.
-
-`!PAT'
- Matches if PAT does not match. For example, the following
- command prints all records in the input file `BBS-list' that do
- *not* contain the string `foo'.
-
- awk '! /foo/' BBS-list
-
-Note that boolean patterns are built from other patterns just as
-boolean expressions are built from other expressions (*note Boolean
-Ops::.). Any boolean expression is also a valid boolean pattern.
-But the converse is not true: simple regular expression patterns such
-as `/foo/' are not allowed in boolean expressions. Regular
-expressions can appear in boolean expressions only in conjunction
-with the matching operators, `~' and `!~'.
-
-
-
-File: gawk-info, Node: Conditional Patterns, Prev: Boolean, Up: Patterns
-
-Conditional Patterns
-====================
-
-Patterns may use a "conditional expression" much like the conditional
-expression of the C language. This takes the form:
-
- PAT1 ? PAT2 : PAT3
-
-The first pattern is evaluated. If it evaluates to TRUE, then the
-input record is tested against PAT2. Otherwise it is tested against
-PAT3. The conditional pattern matches if PAT2 or PAT3 (whichever one
-is selected) matches.
-
-
-
-File: gawk-info, Node: Actions, Next: Expressions, Prev: Patterns, Up: Top
-
-Actions: The Basics
-*******************
-
-The "action" part of an `awk' rule tells `awk' what to do once a
-match for the pattern is found. An action consists of one or more
-`awk' "statements", enclosed in curly braces (`{' and `}'). The
-curly braces must be used even if the action contains only one
-statement, or even if it contains no statements at all. Action
-statements are separated by newlines or semicolons.
-
-Besides the print statements already covered (*note Printing::.),
-there are four kinds of action statements: expressions, control
-statements, compound statements, and function definitions.
-
- * "Expressions" include assignments, arithmetic, function calls,
- and more (*note Expressions::.).
-
- * "Control statements" specify the control flow of `awk' programs.
- The `awk' language gives you C--like constructs (`if', `for',
- `while', and so on) as well as a few special ones (*note
- Statements::.).
-
- * A "compound statement" is just one or more `awk' statements
- enclosed in curly braces. This way you can group several
- statements to form the body of an `if' or similar statement.
-
- * You can define "user--defined functions" for use elsewhere in
- the `awk' program (*note User-defined::.).
-
-
-
-File: gawk-info, Node: Expressions, Next: Statements, Prev: Actions, Up: Top
-
-Actions: Expressions
-********************
-
-Expressions are the basic building block of `awk' actions. An
-expression evaluates to a value, which you can print, test, store in
-a variable or pass to a function.
-
-But, beyond that, an expression can assign a new value to a variable
-or a field, with an assignment operator.
-
-An expression can serve as a statement on its own. Most other action
-statements are made up of various combinations of expressions. As in
-other languages, expressions in `awk' include variables, array
-references, constants, and function calls, as well as combinations of
-these with various operators.
-
-* Menu:
-
-* Constants:: String and numeric constants.
-* Variables:: Variables give names to values for future use.
-* Fields:: Field references such as `$1' are also expressions.
-* Arrays:: Array element references are expressions.
-
-* Arithmetic Ops:: Arithmetic operations (`+', `-', etc.)
-* Concatenation:: Concatenating strings.
-* Comparison Ops:: Comparison of numbers and strings with `<', etc.
-* Boolean Ops:: Combining comparison expressions using boolean operators
- `||' (``or''), `&&' (``and'') and `!' (``not'').
-
-* Assignment Ops:: Changing the value of a variable or a field.
-* Increment Ops:: Incrementing the numeric value of a variable.
-
-* Conversion:: The conversion of strings to numbers and vice versa.
-* Conditional Exp:: Conditional expressions select between two subexpressions
- under control of a third subexpression.
-* Function Calls:: A function call is an expression.
-
-
-
-File: gawk-info, Node: Constants, Next: Variables, Up: Expressions
-
-Constant Expressions
-====================
-
-There are two types of constants: numeric constants and string
-constants.
-
-The "numeric constant" is a number. This number can be an integer, a
-decimal fraction, or a number in scientific (exponential) notation.
-Note that all numeric values are represented within `awk' in
-double--precision floating point. Here are some examples of numeric
-constants, which all have the same value:
-
- 105
- 1.05e+2
- 1050e-1
-
-A string constant consists of a sequence of characters enclosed in
-double--quote marks. For example:
-
- "parrot"
-
-represents the string constant `parrot'. Strings in `gawk' can be of
-any length and they can contain all the possible 8--bit ASCII
-characters including ASCII NUL. Other `awk' implementations may have
-difficulty with some character codes.
-
-Some characters cannot be included literally in a string. You
-represent them instead with "escape sequences", which are character
-sequences beginning with a backslash (`\').
-
-One use of the backslash is to include double--quote characters in a
-string. Since a plain double--quote would end the string, you must
-use `\"'. Backslash itself is another character that can't be
-included normally; you write `\\' to put one backslash in the string.
-
-Another use of backslash is to represent unprintable characters such
-as newline. While there is nothing to stop you from writing these
-characters directly in an `awk' program, they may look ugly.
-
-`\b'
- Represents a backspaced, H'.
-
-`\f'
- Represents a formfeed, L'.
-
-`\n'
- Represents a newline, J'.
-
-`\r'
- Represents a carriage return, M'.
-
-`\t'
- Represents a horizontal tab, I'.
-
-`\v'
- Represents a vertical tab, K'.
-
-`\NNN'
- Represents the octal value NNN, where NNN is one to three digits
- between 0 and 7. For example, the code for the ASCII ESC
- (escape) character is `\033'.
-
-
-
-File: gawk-info, Node: Variables, Next: Arithmetic Ops, Prev: Constants, Up: Expressions
-
-Variables
-=========
-
-Variables let you give names to values and refer to them later. You
-have already seen variables in many of the examples. The name of a
-variable must be a sequence of letters, digits and underscores, but
-it may not begin with a digit. Case is significant in variable
-names; `a' and `A' are distinct variables.
-
-A variable name is a valid expression by itself; it represents the
-variable's current value. Variables are given new values with
-"assignment operators" and "increment operators". *Note Assignment
-Ops::.
-
-A few variables have special built--in meanings, such as `FS', the
-field separator, and `NF', the number of fields in the current input
-record. *Note Special::, for a list of them. Special variables can
-be used and assigned just like all other variables, but their values
-are also used or changed automatically by `awk'. Each special
-variable's name is made entirely of upper case letters.
-
-Variables in `awk' can be assigned either numeric values or string
-values. By default, variables are initialized to the null string,
-which has the numeric value zero. So there is no need to
-``initialize'' each variable explicitly in `awk', the way you would
-need to do in C or most other traditional programming languages.
-
-
-
-File: gawk-info, Node: Arithmetic Ops, Next: Concatenation, Prev: Variables, Up: Expressions
-
-Arithmetic Operators
-====================
-
-The `awk' language uses the common arithmetic operators when
-evaluating expressions. All of these arithmetic operators follow
-normal precedence rules, and work as you would expect them to. This
-example divides field 3 by field 4, adds field 2, stores the result
-into field 1, and prints the results:
-
- awk '{ $1 = $2 + $3 / $4; print }' inventory-shipped
-
-The arithmetic operators in `awk' are:
-
-`X + Y'
- Addition.
-
-`X - Y'
- Subtraction.
-
-`- X'
- Negation.
-
-`X / Y'
- Division. Since all numbers in `awk' are double--precision
- floating point, the result is not rounded to an integer: `3 / 4'
- has the value 0.75.
-
-`X * Y'
- Multiplication.
-
-`X % Y'
- Remainder. The quotient is rounded toward zero to an integer,
- multiplied by Y and this result is subtracted from X. This
- operation is sometimes known as ``trunc--mod''. The following
- relation always holds:
-
- `b * int(a / b) + (a % b) == a'
-
- One undesirable effect of this definition of remainder is that X
- % Y is negative if X is negative. Thus,
-
- -17 % 8 = -1
-
-`X ^ Y'
-`X ** Y'
- Exponentiation: X raised to the Y power. `2 ^ 3' has the value
- 8. The character sequence `**' is equivalent to `^'.
-
-
-
-File: gawk-info, Node: Concatenation, Next: Comparison Ops, Prev: Arithmetic Ops, Up: Expressions
-
-String Concatenation
-====================
-
-There is only one string operation: concatenation. It does not have
-a specific operator to represent it. Instead, concatenation is
-performed by writing expressions next to one another, with no
-operator. For example:
-
- awk '{ print "Field number one: " $1 }' BBS-list
-
-produces, for the first record in `BBS-list':
-
- Field number one: aardvark
-
-If you hadn't put the space after the `:', the line would have run
-together. For example:
-
- awk '{ print "Field number one:" $1 }' BBS-list
-
-produces, for the first record in `BBS-list':
-
- Field number one:aardvark
-
-
-
-File: gawk-info, Node: Comparison Ops, Next: Boolean Ops, Prev: Concatenation, Up: Expressions
-
-Comparison Expressions
-======================
-
-"Comparison expressions" use "relational operators" to compare
-strings or numbers. The relational operators are the same as in C.
-Here is a table of them:
-
-`X < Y'
- True if X is less than Y.
-
-`X <= Y'
- True if X is less than or equal to Y.
-
-`X > Y'
- True if X is greater than Y.
-
-`X >= Y'
- True if X is greater than or equal to Y.
-
-`X == Y'
- True if X is equal to Y.
-
-`X != Y'
- True if X is not equal to Y.
-
-`X ~ REGEXP'
- True if regexp REGEXP matches the string X.
-
-`X !~ REGEXP'
- True if regexp REGEXP does not match the string X.
-
-`SUBSCRIPT in ARRAY'
- True if array ARRAY has an element with the subscript SUBSCRIPT.
-
-Comparison expressions have the value 1 if true and 0 if false.
-
-The operands of a relational operator are compared as numbers if they
-are both numbers. Otherwise they are converted to, and compared as,
-strings (*note Conversion::.). Strings are compared by comparing the
-first character of each, then the second character of each, and so on.
-Thus, `"10"' is less than `"9"'.
-
-For example,
-
- $1 == "foo"
-
-has the value of 1, or is true, if the first field of the current
-input record is precisely `foo'. By contrast,
-
- $1 ~ /foo/
-
-has the value 1 if the first field contains `foo'.
-
-
-
-File: gawk-info, Node: Boolean Ops, Next: Assignment Ops, Prev: Comparison Ops, Up: Expressions
-
-Boolean Operators
-=================
-
-A boolean expression is combination of comparison expressions or
-matching expressions, using the boolean operators ``or'' (`||'),
-``and'' (`&&'), and ``not'' (`!'), along with parentheses to control
-nesting. The truth of the boolean expression is computed by
-combining the truth values of the component expressions.
-
-Boolean expressions can be used wherever comparison and matching
-expressions can be used. They can be used in `if' and `while'
-statements. They have numeric values (1 if true, 0 if false).
-
-In addition, every boolean expression is also a valid boolean
-pattern, so you can use it as a pattern to control the execution of
-rules.
-
-Here are descriptions of the three boolean operators, with an example
-of each. It may be instructive to compare these examples with the
-analogous examples of boolean patterns (*note Boolean::.), which use
-the same boolean operators in patterns instead of expressions.
-
-`BOOLEAN1 && BOOLEAN2'
- True if both BOOLEAN1 and BOOLEAN2 are true. For example, the
- following statement prints the current input record if it
- contains both `2400' and `foo'.
-
- if ($0 ~ /2400/ && $0 ~ /foo/) print
-
- The subexpression BOOLEAN2 is evaluated only if BOOLEAN1 is
- true. This can make a difference when BOOLEAN2 contains
- expressions that have side effects: in the case of `$0 ~ /foo/
- && ($2 == bar++)', the variable `bar' is not incremented if
- there is no `foo' in the record.
-
-`BOOLEAN1 || BOOLEAN2'
- True if at least one of BOOLEAN1 and BOOLEAN2 is true. For
- example, the following command prints all records in the input
- file `BBS-list' that contain *either* `2400' or `foo', or both.
-
- awk '{ if ($0 ~ /2400/ || $0 ~ /foo/) print }' BBS-list
-
- The subexpression BOOLEAN2 is evaluated only if BOOLEAN1 is
- true. This can make a difference when BOOLEAN2 contains
- expressions that have side effects.
-
-`!BOOLEAN'
- True if BOOLEAN is false. For example, the following program
- prints all records in the input file `BBS-list' that do *not*
- contain the string `foo'.
-
- awk '{ if (! ($0 ~ /foo/)) print }' BBS-list
-
-
-
-File: gawk-info, Node: Assignment Ops, Next: Increment Ops, Prev: Boolean Ops, Up: Expressions
-
-Assignment Operators
-====================
-
-An "assignment" is an expression that stores a new value into a
-variable. For example, let's assign the value 1 to the variable `z':
-
- z = 1
-
-After this expression is executed, the variable `z' has the value 1.
-Whatever old value `z' had before the assignment is forgotten.
-
-The `=' sign is called an "assignment operator". It is the simplest
-assignment operator because the value of the right--hand operand is
-stored unchanged.
-
-The left--hand operand of an assignment can be a variable (*note
-Variables::.), a field (*note Changing Fields::.) or an array element
-(*note Arrays::.). These are all called "lvalues", which means they
-can appear on the left side of an assignment operator. The
-right--hand operand may be any expression; it produces the new value
-which the assignment stores in the specified variable, field or array
-element.
-
-Assignments can store string values also. For example, this would
-store the value `"this food is good"' in the variable `message':
-
- thing = "food"
- predicate = "good"
- message = "this " thing " is " predicate
-
-(This also illustrates concatenation of strings.)
-
-It is important to note that variables do *not* have permanent types.
-The type of a variable is simply the type of whatever value it
-happens to hold at the moment. In the following program fragment,
-the variable `foo' has a numeric value at first, and a string value
-later on:
-
- foo = 1
- print foo
- foo = "bar"
- print foo
-
-When the second assignment gives `foo' a string value, the fact that
-it previously had a numeric value is forgotten.
-
-An assignment is an expression, so it has a value: the same value
-that is assigned. Thus, `z = 1' as an expression has the value 1.
-One consequence of this is that you can write multiple assignments
-together:
-
- x = y = z = 0
-
-stores the value 0 in all three variables. It does this because the
-value of `z = 0', which is 0, is stored into `y', and then the value
-of `y = z = 0', which is 0, is stored into `x'.
-
-You can use an assignment anywhere an expression is called for. For
-example, it is valid to write `x != (y = 1)' to set `y' to 1 and then
-test whether `x' equals 1. But this style tends to make programs
-hard to read; except in a one--shot program, you should rewrite it to
-get rid of such nesting of assignments. This is never very hard.
-
-Aside from `=', there are several other assignment operators that do
-arithmetic with the old value of the variable. For example, the
-operator `+=' computes a new value by adding the right--hand value to
-the old value of the variable. Thus, the following assignment adds 5
-to the value of `foo':
-
- foo += 5
-
-This is precisely equivalent to the following:
-
- foo = foo + 5
-
-Use whichever one makes the meaning of your program clearer.
-
-Here is a table of the arithmetic assignment operators. In each
-case, the right--hand operand is an expression whose value is
-converted to a number.
-
-`LVALUE += INCREMENT'
- Adds INCREMENT to the value of LVALUE to make the new value of
- LVALUE.
-
-`LVALUE -= DECREMENT'
- Subtracts DECREMENT from the value of LVALUE.
-
-`LVALUE *= COEFFICIENT'
- Multiplies the value of LVALUE by COEFFICIENT.
-
-`LVALUE /= QUOTIENT'
- Divides the value of LVALUE by QUOTIENT.
-
-`LVALUE %= MODULUS'
- Sets LVALUE to its remainder by MODULUS.
-
-`LVALUE ^= POWER'
-`LVALUE **= POWER'
- Raises LVALUE to the power POWER.
-
-
-
-File: gawk-info, Node: Increment Ops, Next: Conversion, Prev: Assignment Ops, Up: Expressions
-
-Increment Operators
-===================
-
-"Increment operators" increase or decrease the value of a variable by
-1. You could do the same thing with an assignment operator, so the
-increment operators add no power to the `awk' language; but they are
-convenient abbreviations for something very common.
-
-The operator to add 1 is written `++'. There are two ways to use
-this operator: pre--incrementation and post--incrementation.
-
-To pre--increment a variable V, write `++V'. This adds 1 to the
-value of V and that new value is also the value of this expression.
-The assignment expression `V += 1' is completely equivalent.
-
-Writing the `++' after the variable specifies post--increment. This
-increments the variable value just the same; the difference is that
-the value of the increment expression itself is the variable's *old*
-value. Thus, if `foo' has value 4, then the expression `foo++' has
-the value 4, but it changes the value of `foo' to 5.
-
-The post--increment `foo++' is nearly equivalent to writing `(foo +=
-1) - 1'. It is not perfectly equivalent because all numbers in `awk'
-are floating point: in floating point, `foo + 1 - 1' does not
-necessarily equal `foo'. But the difference will be minute as long
-as you stick to numbers that are fairly small (less than a trillion).
-
-Any lvalue can be incremented. Fields and array elements are
-incremented just like variables.
-
-The decrement operator `--' works just like `++' except that it
-subtracts 1 instead of adding. Like `++', it can be used before the
-lvalue to pre--decrement or after it to post--decrement.
-
-Here is a summary of increment and decrement expressions.
-
-`++LVALUE'
- This expression increments LVALUE and the new value becomes the
- value of this expression.
-
-`LVALUE++'
- This expression causes the contents of LVALUE to be incremented.
- The value of the expression is the *old* value of LVALUE.
-
-`--LVALUE'
- Like `++LVALUE', but instead of adding, it subtracts. It
- decrements LVALUE and delivers the value that results.
-
-`LVALUE--'
- Like `LVALUE++', but instead of adding, it subtracts. It
- decrements LVALUE. The value of the expression is the *old*
- value of LVALUE.
-
-
-
-File: gawk-info, Node: Conversion, Next: Conditional Exp, Prev: Increment Ops, Up: Expressions
-
-Conversion of Strings and Numbers
-=================================
-
-Strings are converted to numbers, and numbers to strings, if the
-context of your `awk' statement demands it. For example, if the
-values of `foo' or `bar' in the expression `foo + bar' happen to be
-strings, they are converted to numbers before the addition is
-performed. If numeric values appear in string concatenation, they
-are converted to strings. Consider this:
-
- two = 2; three = 3
- print (two three) + 4
-
-This eventually prints the (numeric) value `27'. The numeric
-variables `two' and `three' are converted to strings and concatenated
-together, and the resulting string is converted back to a number
-before adding `4'. The resulting numeric value `27' is printed.
-
-If, for some reason, you need to force a number to be converted to a
-string, concatenate the null string with that number. To force a
-string to be converted to a number, add zero to that string. Strings
-that can't be interpreted as valid numbers are given the numeric
-value zero.
-
-The exact manner in which numbers are converted into strings is
-controlled by the `awk' special variable `OFMT' (*note Special::.).
-Numbers are converted using a special version of the `sprintf'
-function (*note Built-in::.) with `OFMT' as the format specifier.
-
-`OFMT''s default value is `"%.6g"', which prints a value with at
-least six significant digits. You might want to change it to specify
-more precision, if your version of `awk' uses double precision
-arithmetic. Double precision on most modern machines gives you 16 or
-17 decimal digits of precision.
-
-Strange results can happen if you set `OFMT' to a string that doesn't
-tell `sprintf' how to format floating point numbers in a useful way.
-For example, if you forget the `%' in the format, all numbers will be
-converted to the same constant string.
-
-
-
-File: gawk-info, Node: Conditional Exp, Next: Function Calls, Prev: Conversion, Up: Expressions
-
-Conditional Expressions
-=======================
-
-A "conditional expression" is a special kind of expression with three
-operands. It allows you to use one expression's value to select one
-of two other expressions.
-
-The conditional expression looks the same as in the C language:
-
- SELECTOR ? IF-TRUE-EXP : IF-FALSE-EXP
-
-There are three subexpressions. The first, SELECTOR, is always
-computed first. If it is ``true'' (not zero) then IF-TRUE-EXP is
-computed next and its value becomes the value of the whole expression.
-Otherwise, IF-FALSE-EXP is computed next and its value becomes the
-value of the whole expression.
-
-For example, this expression produces the absolute value of `x':
-
- x > 0 ? x : -x
-
-Each time the conditional expression is computed, exactly one of
-IF-TRUE-EXP and IF-FALSE-EXP is computed; the other is ignored. This
-is important when the expressions contain side effects. For example,
-this conditional expression examines element `i' of either array `a'
-or array `b', and increments `i'.
-
- x == y ? a[i++] : b[i++]
-
-This is guaranteed to increment `i' exactly once, because each time
-one or the other of the two increment expressions will be executed
-and the other will not be.
-
-
-
-File: gawk-info, Node: Function Calls, Prev: Conditional Exp, Up: Expressions
-
-Function Calls
-==============
-
-A "function" is a name for a particular calculation. Because it has
-a name, you can ask for it by name at any point in the program. For
-example, the function `sqrt' computes the square root of a number.
-
-A fixed set of functions are "built in", which means they are
-available in every `awk' program. The `sqrt' function is one of
-these. *Note Built-in::, for a list of built--in functions and their
-descriptions. In addition, you can define your own functions in the
-program for use elsewhere in the same program. *Note User-defined::,
-for how to do this.
-
-The way to use a function is with a "function call" expression, which
-consists of the function name followed by a list of "arguments" in
-parentheses. The arguments are expressions which give the raw
-materials for the calculation that the function will do. When there
-is more than one argument, they are separated by commas. If there
-are no arguments, write just `()' after the function name.
-
-*Do not put any space between the function name and the
-open--parenthesis!* A user--defined function name looks just like
-the name of a variable, and space would make the expression look like
-concatenation of a variable with an expression inside parentheses.
-Space before the parenthesis is harmless with built--in functions,
-but it is best not to get into the habit of using space, lest you do
-likewise for a user--defined function one day by mistake.
-
-Each function needs a particular number of arguments. For example,
-the `sqrt' function must be called with a single argument, like this:
-
- sqrt(ARGUMENT)
-
-The argument is the number to take the square root of.
-
-Some of the built--in functions allow you to omit the final argument.
-If you do so, they will use a reasonable default. *Note Built-in::,
-for full details. If arguments are omitted in calls to user--defined
-functions, then those arguments are treated as local variables,
-initialized to the null string (*note User-defined::.).
-
-Like every other expression, the function call has a value, which is
-computed by the function based on the arguments you give it. In this
-example, the value of `sqrt(ARGUMENT)' is the square root of the
-argument. A function can also have side effects, such as assigning
-the values of certain variables or doing I/O.
-
-Here is a command to read numbers, one number per line, and print the
-square root of each one:
-
- awk '{ print "The square root of", $1, "is", sqrt($1) }'
-
-
-
-File: gawk-info, Node: Statements, Next: Arrays, Prev: Expressions, Up: Top
-
-Actions: Statements
-*******************
-
-"Control statements" such as `if', `while', and so on control the
-flow of execution in `awk' programs. Most of the control statements
-in `awk' are patterned on similar statements in C.
-
-The simplest kind of statement is an expression. The other kinds of
-statements start with special keywords such as `if' and `while', to
-distinguish them from simple expressions.
-
-In all the examples in this chapter, BODY can be either a single
-statement or a group of statements. Groups of statements are
-enclosed in braces, and separated by newlines or semicolons.
-
-* Menu:
-
-* Expressions:: One kind of statement simply computes an expression.
-
-* If:: Conditionally execute some `awk' statements.
-
-* While:: Loop until some condition is satisfied.
-
-* Do:: Do specified action while looping until some
- condition is satisfied.
-
-* For:: Another looping statement, that provides
- initialization and increment clauses.
-
-* Break:: Immediately exit the innermost enclosing loop.
-
-* Continue:: Skip to the end of the innermost enclosing loop.
-
-* Next:: Stop processing the current input record.
-
-* Exit:: Stop execution of `awk'.
-
-
-
-File: gawk-info, Node: If, Next: While, Up: Statements
-
-The `if' Statement
-==================
-
-The `if'-`else' statement is `awk''s decision--making statement. The
-`else' part of the statement is optional.
-
- `if (CONDITION) BODY1 else BODY2'
-
-Here CONDITION is an expression that controls what the rest of the
-statement will do. If CONDITION is true, BODY1 is executed;
-otherwise, BODY2 is executed (assuming that the `else' clause is
-present). The condition is considered true if it is nonzero or
-nonnull.
-
-Here is an example:
-
- awk '{ if (x % 2 == 0)
- print "x is even"
- else
- print "x is odd" }'
-
-In this example, if the statement containing `x' is found to be true
-(that is, x is divisible by 2), then the first `print' statement is
-executed, otherwise the second `print' statement is performed.
-
-If the `else' appears on the same line as BODY1, and BODY1 is a
-single statement, then a semicolon must separate BODY1 from `else'.
-To illustrate this, let's rewrite the previous example:
-
- awk '{ if (x % 2 == 0) print "x is even"; else
- print "x is odd" }'
-
-If you forget the `;', `awk' won't be able to parse it, and you will
-get a syntax error.
-
-We would not actually write this example this way, because a human
-reader might fail to see the `else' if it were not the first thing on
-its line.
-
-
-
-File: gawk-info, Node: While, Next: Do, Prev: If, Up: Statements
-
-The `while' Statement
-=====================
-
-In programming, a loop means a part of a program that is (or at least
-can be) executed two or more times in succession.
-
-The `while' statement is the simplest looping statement in `awk'. It
-repeatedly executes a statement as long as a condition is true. It
-looks like this:
-
- while (CONDITION)
- BODY
-
-Here BODY is a statement that we call the "body" of the loop, and
-CONDITION is an expression that controls how long the loop keeps
-running.
-
-The first thing the `while' statement does is test CONDITION. If
-CONDITION is true, it executes the statement BODY. After BODY has
-been executed, CONDITION is tested again and this process is repeated
-until CONDITION is no longer true. If CONDITION is initially false,
-the body of the loop is never executed.
-
- awk '{ i = 1
- while (i <= 3) {
- print $i
- i++
- }
- }'
-
-This example prints the first three input fields, one per line.
-
-The loop works like this: first, the value of `i' is set to 1. Then,
-the `while' tests whether `i' is less than or equal to three. This
-is the case when `i' equals one, so the `i'-th field is printed.
-Then the `i++' increments the value of `i' and the loop repeats.
-
-When `i' reaches 4, the loop exits. Here BODY is a compound
-statement enclosed in braces. As you can see, a newline is not
-required between the condition and the body; but using one makes the
-program clearer unless the body is a compound statement or is very
-simple.
-
-
-
-File: gawk-info, Node: Do, Next: For, Prev: While, Up: Statements
-
-The `do'--`while' Statement
-===========================
-
-The `do' loop is a variation of the `while' looping statement. The
-`do' loop executes the BODY once, then repeats BODY as long as
-CONDITION is true. It looks like this:
-
- do
- BODY
- while (CONDITION)
-
-Even if CONDITION is false at the start, BODY is executed at least
-once (and only once, unless executing BODY makes CONDITION true).
-Contrast this with the corresponding `while' statement:
-
- while (CONDITION)
- BODY
-
-This statement will not execute BODY even once if CONDITION is false
-to begin with.
-
-Here is an example of a `do' statement:
-
- awk '{ i = 1
- do {
- print $0
- i++
- } while (i <= 10)
- }'
-
-prints each input record ten times. It isn't a very realistic
-example, since in this case an ordinary `while' would do just as
-well. But this is normal; there is only occasionally a real use for
-a `do' statement.
-
-