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
이제 추가 문자가 포함됩니다.