当我使用awk计算文件中的行数时:
cat ~/.account | wc -l
......结果是:
384
但是当我使用awk时:
awk 'BEGIN {x = "1.02"; y = 0; } {x = x*2; y = y + 1} END {print x; print y}' ~/.account
......结果是:
8.03800926406447389928897056654e+115
385
这是为什么?
答案 0 :(得分:2)
wc -l
正在做什么来自man wc
:
-l, - lines
打印换行计数
使用wc -l
计算换行符数,awk
将输入分隔为由换行符分隔的记录。
考虑这个例子:
$ echo 1 | wc -l
1
$ echo -n 1 | wc -l
0
第一个命令(echo 1
)的输入是字符串"1\n"
。使用-n
与echo
回复1
,最后没有换行符,这使得输入只是字符串"1"
。 wc -l
计算输入中的换行符。在第一种情况下,有一个换行符,而在第二种情况下没有换行符。
AWK将其输入划分为记录,并将每个记录划分为字段。这是AWK为我们解析魔法的重要部分。
来自The GNU AWK User's Guide(但指的是标准AWK):
记录由名为记录分隔符的字符分隔。默认情况下,记录分隔符是换行符。这就是为什么记录默认为单行。
但如果输入以此分隔符结束,请查看会发生什么:
$ echo 1 | awk 'END{print NR}'
1
$ echo -n 1 | awk 'END{print NR}'
1
(NR
是"从目前为止从所有数据文件中读取的输入记录总数的特殊变量。")
每种情况下只有一条记录,甚至包含换行符的第一条记录("1\n"
)。由于分隔符之后没有任何内容,因此它不会分离。换句话说,如果输入以分隔符结束,则它不会在结尾处给出空记录。
如果您的输入文件未以换行符字符结尾,则wc -l
将报告少于awk
个记录数({{1} })。