为什么wc报告的文件中的行数与awk读取的记录数不同?

时间:2016-01-28 03:59:30

标签: awk wc

当我使用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

这是为什么?

1 个答案:

答案 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"。使用-necho回复1 ,最后没有换行符,这使得输入只是字符串"1"wc -l计算输入中的换行符。在第一种情况下,有一个换行符,而在第二种情况下没有换行符。

AWK正在做什么

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} })。