Getline Notes (The GNU Awk User’s Guide)
Next: Getline Summary, Previous: Getline/Variable/Coprocess, Up: Getline [Contents][Index]
4.10.9 Points to Remember About getline
Here are some miscellaneous points about getline that you should bear in mind:
- When
getlinechanges the value of$0andNF,awkdoes not automatically jump to the start of the program and start testing the new record against every pattern. However, the new record is tested against any subsequent rules. - Some very old
awkimplementations limit the number of pipelines that anawkprogram may have open to just one. Ingawk, there is no such limit. You can open as many pipelines (and coprocesses) as the underlying operating system permits. - An interesting side effect occurs if you use
getlinewithout a redirection inside aBEGINrule. Because an unredirectedgetlinereads from the command-line data files, the firstgetlinecommand causesawkto set the value ofFILENAME. Normally,FILENAMEdoes not have a value insideBEGINrules, because you have not yet started to process the command-line data files. (d.c.) (See The BEGIN and END Special Patterns; also see section Built-in Variables That Convey Information.) - Using
FILENAMEwithgetline(‘getline < FILENAME’) is likely to be a source of confusion.awkopens a separate input stream from the current input file. However, by not using a variable,$0andNFare still updated. If you’re doing this, it’s probably by accident, and you should reconsider what it is you’re trying to accomplish. - Summary of
getlineVariants, presents a table summarizing thegetlinevariants and which variables they can affect. It is worth noting that those variants that do not use redirection can causeFILENAMEto be updated if they causeawkto start reading a new input file. If the variable being assigned is an expression with side effects, different versions of
awkbehave differently upon encountering end-of-file. Some versions don’t evaluate the expression; many versions (includinggawk) do. Here is an example, courtesy of Duncan Moore:BEGIN { system("echo 1 > f") while ((getline a[++c] < "f") > 0) { } print c }Here, the side effect is the ‘
++c’. Iscincremented if end-of-file is encountered before the element inais assigned?gawktreatsgetlinelike a function call, and evaluates the expression ‘a[++c]’ before attempting to read fromf. However, some versions ofawkonly evaluate the expression once they know that there is a string value to be assigned.
Next: Getline Summary, Previous: Getline/Variable/Coprocess, Up: Getline [Contents][Index]