저는 bash를 처음 접했고 파일의 문자 수를 계산하려고합니다. 나는 다음 함수를 작성했습니다.
function chars(){
m=$(cat $1)
m=${#m}
echo $m
}
echo $(chars $2)
파일에서 호출한 결과는 524이고, wc -c
동일한 파일에서 호출한 결과는 525입니다. 차이의 원인은 무엇입니까? 어떻게 하면 같은 결과를 얻을 수 있나요? (부가적인 질문으로, 함수의 처음 두 줄을 하나로 결합할 수 있나요?)
답변1
wc -c
바이트 수를 반환합니다.
wc -m
문자 수를 반환합니다.
귀하의 함수는 문자 수를 계산하므로 귀하의 함수의 출력 번호는 wc -m
의 출력과 일치해야 한다고 생각합니다.
답변2
wc
다음 명령을 시도해 볼 수 있습니다 .
echo -n file | wc -m
이런 식으로 추가된 추가 개행 문자는 계산되지 않습니다 wc
. 일반적으로 파일 끝에는 개행 문자(편집기가 추가함)가 있습니다 wc
. 따라서 해당 문자도 계산하려면 솔루션을 수정해야 합니다. 그렇지 않으면 함수가 제대로 작동합니다.
답변3
파일을 보지 않고는 이유를 정확히 말하기는 어렵지만, Bash에서 이러한 방식으로 계산할 때 발생하는 문제를 보여주는 작은 예제 파일은 다음과 같습니다.
예
$ cat afile
blah
blah
<EOF>
실제로 는 <EOF>
파일에 존재하지 않으며 파일 끝에 2개의 빈 줄이 있다는 것만 표시됩니다. 따라서 파일을 수동으로 계산하면 그 안에 12개의 문자가 있습니다. 8 + 4(개행 문자)라고 가정해 보겠습니다.
이 파일의 개수를 계산하려면 일반적인 방법을 사용하세요.
$ wc -m afile
12 afile
바이트 수:
$ wc -c afile
12 afile
귀하의 방법을 사용하십시오 :
$ m=$(< afile)
$ echo ${#m}
9
이 계산 방법이 예상대로 작동하지 않는 것 같습니다. \n
다른 문자를 포함하지 않는 줄에 나타나는 줄 끝 문자( ) 는 계산할 수 없습니다 .
너의 문제
524 대 525 질문에 대한 귀하의 설명에 따르면 샘플 파일에 빈 줄이 있는 것 같습니다.
wc
내 솔루션을 적용하는 대신 이 애플리케이션에서 이를 사용하겠습니다 . 이러한 도구는 이유가 있어서 존재합니다. 바퀴를 재발명하지 마세요. 유닉스는 당신의 자동차를 위한 멋진 잡지를 만들었습니다.