What Are Built-in Variables?
Built-in variables are special names that AWK maintains automatically as it reads input. You never declare them; the interpreter populates and updates them for every record and field. The most frequently used ones are NR (the number of the current record, counting from 1 across all input), NF (the number of fields in the current record), $0 (the entire current line), and $1 through $NF (individual fields). Because AWK refreshes these on each line, you can reference them anywhere in a pattern or action and they always reflect the line being processed at that moment.
Cricket analogy: Like a live scoreboard that auto-updates NR as balls bowled and NF as runs off the current ball — you never wind the counter by hand, the scorer does it as each delivery lands.
Record and Field Counters: NR, NF, and FNR
NR counts every record seen since AWK started, so when processing multiple files it keeps climbing across file boundaries. FNR resets to 1 at the start of each new file, which lets you detect where one file ends and another begins. NF holds the field count for the current record and is recomputed each line; assigning a new value to a field beyond NF automatically extends the record and updates NF. A common idiom, $NF, references the last field regardless of how many fields the line has, which is handy for lines of varying width.
Cricket analogy: NR is the overall team total across both innings while FNR is the current innings score that resets after the follow-on — same match, two different running counts like AWK's two counters.
Separator and Formatting Variables
FS is the input field separator (default: whitespace runs), and OFS is the output field separator used when you print fields separated by commas. RS is the input record separator (default: newline) and ORS is the output record separator appended after each print. SUBSEP separates subscripts in multidimensional array keys. Changing OFS alone does not reformat $0 until you force a rebuild — assigning $1=$1 triggers AWK to reconstruct the record using the current OFS, a classic trick for normalising delimiters.
Cricket analogy: FS and OFS are like the difference between how the umpire reads the field placement and how the commentator announces it — same data, input and output conventions differ.
# Show line number, field count, and last field of /etc/passwd
awk -F: '{ print NR, NF, $NF }' /etc/passwd
# Track per-file line numbers across two files
awk '{ print FILENAME, FNR, NR, $0 }' file1.txt file2.txt
# Convert a space-delimited line to CSV by changing OFS and rebuilding
echo "alice 30 engineer" | awk 'BEGIN{OFS=","} { $1=$1; print }'
# -> alice,30,engineerFILENAME holds the name of the file currently being read; it is empty while reading standard input in most AWK implementations and is unset inside a BEGIN block because no file has been opened yet.
Assigning to NF can silently truncate or pad a record: setting NF to a smaller number drops trailing fields, while a larger number creates empty fields. Likewise, editing any field rebuilds $0 using OFS, which can change your line's delimiters unexpectedly.
- NR counts records across all input; FNR resets to 1 for each new file.
- NF is the field count of the current record; $NF references the last field.
- FS/OFS control input/output field separators; RS/ORS control record separators.
- $0 is the whole record; $1..$NF are individual fields, all auto-updated per line.
- Reassigning $1=$1 forces AWK to rebuild $0 using the current OFS.
- FILENAME gives the current file name but is unavailable in BEGIN.
- Assigning to NF or a field mutates the record and can alter delimiters.
Practice what you learned
1. What does the built-in variable NF represent for the current record?
2. How does FNR differ from NR when processing multiple files?
3. Which idiom forces AWK to rebuild $0 using the current OFS?
4. Why can FILENAME be unhelpful inside a BEGIN block?
5. What happens if you assign a smaller number to NF?
Was this page helpful?
You May Also Like
Field Separators and Record Separators
FS and RS govern how AWK splits input into fields and records, while OFS and ORS control how output is reassembled; mastering them unlocks CSV, multiline, and custom-delimited parsing.
User-Defined Variables in AWK
Beyond built-ins, AWK lets you create your own scalar and associative-array variables with dynamic typing and automatic initialization, powering counters, accumulators, and lookups.
BEGIN and END Blocks
BEGIN runs once before any input is read and END runs once after all input is consumed, giving AWK programs a clean place for setup, headers, and final aggregate reporting.
Related Reading
Related Study Notes in Programming
Browse all study notesApache Spark Study Notes
Programming · 30 topics
ProgrammingApache Flink Study Notes
Programming · 30 topics
ProgrammingHadoop Study Notes
Programming · 30 topics
ProgrammingSnowflake Study Notes
Programming · 30 topics
ProgrammingApache Airflow Study Notes
Programming · 30 topics
Programmingdbt (Data Build Tool) Study Notes
Programming · 30 topics