파일의 단어, 문자 및 줄 수를 계산하려면 스크립트에서 wc(단어 개수)를 사용해 보세요.

파일의 단어, 문자 및 줄 수를 계산하려면 스크립트에서 wc(단어 개수)를 사용해 보세요.

저는 운영 체제 과정을 위한 쉘 스크립트를 작성하려고 합니다. 하지만 파일의 내용을 읽을 수는 없습니다. 질문에 대한 답변으로 제가 입력한 내용만 읽은 것 같습니다. 내가 무엇을 놓치고 있는지 잘 모르겠습니다(매우 간단합니다). 미리 감사드립니다.

echo "what file do you want to count? "
read file
mystring=$file
for token in $mystring;
do
    echo -n "lines: ";
    echo -n $token | wc -l;
    echo -n "words: ";
    echo -n $token | wc -w;
    echo -n "chars: ";
    echo -n $token | wc -c;
done

답변1

여러분이 작성하는 스크립트는 해당 파일 이름에 해당하는 파일의 줄 수 등이 아니라 사용자가 입력한 문자열의 줄 수 등을 계산합니다.

다음은 원하는 작업을 수행하고 파일이 존재하지 않거나 일반 파일이 아닌 경우 오류 메시지를 표시하는 스크립트입니다.

#!/bin/sh

echo "Enter filename"
read fname

if [ ! -f "$fname" ]; then
    echo "No such file!" >&2
    exit 1
fi

lines=$( wc -l <"$fname" )
words=$( wc -w <"$fname" )
chars=$( wc -c <"$fname" )

printf 'The file "%s" has %d lines, %d words and %d characters\n' \
    "$fname" "$lines" "$words" "$chars"

wc세 번 호출하는 것을 방지하려면 다음을 수행하세요 .

#!/bin/sh

echo "Enter filename"
read fname

if [ ! -f "$fname" ]; then
    echo "No such file!" >&2
    exit 1
fi

printf 'The file "%s" has %d lines, %d words and %d characters\n' \
    "$fname" $( wc <"$fname" )

이는 기본 출력이 행, 단어 및 문자 수라는 사실을 활용합니다 wc. 이렇게 출력하고 싶다면 그것으로 충분합니다.

답변2

이 코드는 파일의 내용을 읽지 않습니다. 스크립트에서 수행하는 작업은 사용자로부터 파일 이름을 가져온 다음 이를 변수( $file및 이후 $mystring)에 저장하는 것입니다.

를 실행하면 for token in $mystring변수의 내용이 목록으로 표시되지만 $mystring사용자가 입력한 파일 이름만 표시됩니다. 따라서 참조된 모든 명령은 $token사용자로부터 얻은 문자열을 기반으로 작동됩니다.

파일 내용을 조작하려면 cat@faadi: 지적한 대로 사용할 수 있습니다 mystring=$(cat $file).

편집하다:

답변에서 뭔가를 수정하면 됩니다. 내 우려는 당신이 문서를 읽지 못했고 @steeldriver가 그의 의견에서 제기한 또 다른 문제를 해결하지 못했다는 것입니다. 행을 에서 로 변경하면 mystring=$file결국 mystring=$(cat $file)파일 내용을 목록으로 분할하고 wc해당 내용을 실행하게 되므로 원하는 효과를 얻을 수 없습니다.

for 루프를 제거하고 이것을 사용할 수 있습니다(텍스트를 변수에 저장하고 사용하려는 경우 echo).

#!/bin/bash

echo "File to read:"
read file
mystring=$(cat $file)
echo ""
echo "TEXT:"
echo "$mystring"
echo ""
echo -n "Lines: "
echo "$mystring" | wc -l
echo -n "Words: "
echo "$mystring" | wc -w
echo -n "Chars: "
echo "$mystring" | wc -c

또는 @steeldriver가 제안한 대로 wc다음과 같이 파일을 STDIN으로 리디렉션하세요.

#!/bin/bash

echo "File to read:"
read file
echo ""
echo "TEXT:"
cat $file
echo ""
echo -n "Lines: "
wc -l < $file
echo -n "Words: "
wc -w < $file
echo -n "Chars: "
wc -c < $file

관련 정보