nr是awk中全局递增的行计数器,从1开始每读一行加1,跨文件连续计数且不受跳过或过滤影响;常用于带格式行号输出、精准提取指定行、范围处理及间隔取行等场景。

NR 就是 awk 里最直接、最可靠的行号计数器,它从 1 开始,每读一行就自动加 1,全局累计——不管处理几个文件、中间有没有跳过或过滤,它始终反映“这是 awk 从头到尾读进来的第几行”。
NR 的本质:全局递增的行计数器
NR 不关心文件边界,只认“已读取的记录总数”。比如同时处理 a.txt 和 b.txt:
- awk '{print NR, $0}' a.txt b.txt:a.txt 第 1 行输出 “1 内容”,最后一行(假设 a 有 4 行,b 有 3 行)输出 “7 内容”
- 哪怕中间用 next 跳过某行,NR 仍会+1;哪怕用 if (NR > 10) next 过滤,NR 本身不受影响
常用精准用法示例
直接打印带行号的格式化输出:
- awk '{printf "%03d: %s\n", NR, $0}' file.txt → 每行前加三位数行号,如 001: hello
- awk 'NR == 5 {print $0}' file.txt → 精准提取第 5 行整行内容
- awk 'NR >= 10 && NR → 提取第 10 到 20 行(含)
注意区分 NR 和 FNR
当处理多个文件时,NR 容易和 FNR 混淆:
- FNR 是每个文件内部重置的行号,a.txt 的最后一行 FNR 是 4,b.txt 的第一行 FNR 又从 1 开始
- NR == FNR 是经典判断逻辑,表示当前正处理第一个文件(因为只有第一个文件里,全局计数和本文件计数才相等)
- 例如:awk 'NR==FNR{a[$1]=$0;next} $1 in a{print $0,a[$1]}' file1 file2 —— 先读 file1 建哈希表,再读 file2 匹配
结合条件做行号控制
NR 可用于跳过标题、采样、分段处理等场景:
- 跳过首行(如 CSV 表头):awk 'NR > 1 {print $1,$3}' data.csv
- 每隔 3 行取一行(行号模 3 余 1):awk 'NR % 3 == 1' file.txt
- 只处理前 100 行防止卡死:awk 'NR











