我担心awk
显示的记录长度。我正在检查一些文件的特定记录长度 - awk 显示了我想要的结果,但文件大小显示文件中的每个记录实际上比所说的大awk
1 个字节。
$ 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:awk
开AIX 5.3
答案1
你所看到的情况是完全正常的。默认情况下,awk 不在记录中包含换行符。
输入应被解释为记录序列。默认情况下,一条记录是一行,减去其终止 <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
现在包含了附加字符。