Почему awk не показывает правильную длину записи?

Я обеспокоен тем, что 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 не учитывает характер End Of Line , поэтому делает реальную длину записи 459 . Как вы думаете?

ps: awk на AIX 5.3

Это связано с тем, что по умолчанию разделитель записей по умолчанию установлен в новую строку.

Поэтому 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 

Дополнительный персонаж теперь включен.

То, что вы видите, совершенно нормально. По умолчанию awk не включает символ новой строки в записи.

Из стандарта POSIX для awk :

Входные данные должны интерпретироваться как последовательность записей. По умолчанию запись представляет собой строку, за исключением ее завершающей <новой строки>

Строковые функции
length [([s])] – Возвращает длину в символах своего аргумента, взятого в виде строки, или всей записи, $ 0, если аргументов нет.