공백을 계산하지 않고 각 레코드의 필드 평균 길이를 알려주는 스크립트를 awk에 어떻게 작성할 수 있습니까?

공백을 계산하지 않고 각 레코드의 필드 평균 길이를 알려주는 스크립트를 awk에 어떻게 작성할 수 있습니까?

따라서 텍스트 문서에 있는 각 레코드의 평균 필드 길이를 찾아 인쇄하려면 awk 스크립트 파일을 작성해야 합니다. 텍스트 문서는 다음과 같습니다.

The quick brown fox jumped over the lazy dog's back.
The rain in Spain falls mainly on the plain.
The rain in Spain also falls on the mountains.

지금 내가 스크립트 파일에서 사용하고 있는 것은 다음과 같습니다.

{average = length($0)/NF
   print "Average field length for record: " average}

"length($0)"를 수행하면 레코드의 모든 내용이 계산됩니다. length($1)+length($2)+length($3)+etc와 같은 작업을 시도했지만 레코드의 길이가 다르므로 설명할 수 없습니다. 특히 이는 모든 길이의 레코드에 작동해야 하기 때문입니다.

내가 겪고 있는 문제는 각 필드 사이의 공간을 계산하지만 계산하고 싶지 않다는 것입니다. 현재 각 레코드에 대해 내가 얻는 숫자는 5.2, 4.8 및 5.1입니다. 공백을 세지 않는 방법이 있나요?

이 외에도 전체 파일의 평균 필드 길이도 찾아야 합니다. 다시 말하지만, 내 awk 스크립트는 내가 원하지 않는 공백도 계산한다고 생각합니다. 이것은 내 스크립트 파일입니다.

BEGIN{
        sum = 0
     }
{
     sum += length()
     sum = sum/NF
}
END{
     print "Average field length in file: " sum
     }

공백을 계산하지 않고 글자와 구두점만 계산하고 기본적으로 공백을 제외한 모든 것을 계산하려면 어떻게 수정해야 합니까? 실제로 텍스트 파일의 모든 필드에서 얻은 평균은 5.7인데 이는 잘못된 것 같습니다.

답변1

기본 필드 구분 기호를 사용하고 필드 크기를 계산하여 공백을 건너뛰고 변수를 사용하여 다양한 필드 수를 설명함으로써 제안을 따를 수 있습니다 NF.

따라서 각 레코드의 평균은 다음과 같습니다.

NF > 0 {
    linesum = 0
    for (i = 1; i <= NF; i++) linesum += length($i)
    print "Average field length for record: " linesum / NF
}

전체 파일의 경우:

{
    for (i = 1; i <= NF; i++) sum += length($i)
    count += NF
}

END { if (count > 0) { print "Average field length in file: " (sum / count) } }

이는 또한 행별로 평균을 계산하는 문제를 해결합니다.

귀하의 예에 따르면 평균은 4.17857(구두점 계산)입니다.

관련 정보