awk가 올바른 레코드 길이를 표시하지 않는 이유는 무엇입니까?

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고려되지 않는다는 것입니다줄 끝문자이므로 실제 레코드 길이는 459. 어떻게 생각하나요?

추신: awk켜짐AIX 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

이제 추가 문자가 포함됩니다.

관련 정보