为什么 awk 不显示正确的记录长度?

为什么 awk 不显示正确的记录长度?

我担心awk显示的记录长度。我正在检查一些文件的特定记录长度 - awk 显示了我想要的结果,但文件大小显示文件中的每个记录实际上比所说的大awk1 个字节。

$ ls -l some_file.txt
-rw-r--r--    1 foo   bar           250614 Oct 20 08:49 some_file.txt

$ awk '{ print length }' some_file.txt | sort -u
458

$ echo "(250614%458)" | bc
88

$ echo "(250614%459)" | bc
0

请注意,bc记录长度为 时,结果是错误的458,但记录长度为 时,结果似乎很好459。另外,awk+sort表明全部记录的记录长度为458。我有根据的猜测是,这awk并没有考虑到行结束字符,因此实际记录长度为459。你怎么认为?

PS:awkAIX 5.3

答案1

你所看到的情况是完全正常的。默认情况下,awk 不在记录中包含换行符。

来自awk 的 POSIX 标准:

输入应被解释为记录序列。默认情况下,一条记录是一行,减去其终止 <newline>
...
字符串函数
   length[([s])] - 返回其作为字符串的参数或整个记录的长度(以字符为单位), $0,如果没有参数。

答案2

这是因为默认的记录分隔符RS设置为换行符。

因此awk将其解释为分隔符而不是长度中的字符。

要检查RS设置的内容:

echo | awk '{print "\""RS"\""}'
"
"

引号由显示值的换行符分隔RS

要确认该RS字符不包含在长度输出中:

$ echo test > some_file.txt
$ ls -l
-rw-r--r--. 1 user user    5 Oct 20 16:33 some_file.txt

显示设置为换行符的长度RS

$ awk '{print length}' some_file.txt
4

设置RS为文件中不存在的字符并重新计数:

$ awk 'BEGIN {RS=":"} {print length}' some_file.txt
5

现在包含了附加字符。

相关内容