tentando usar wc (contagem de palavras) dentro de um script para contar as palavras, caracteres, linhas de um arquivo

0

Eu estou tentando escrever um script de shell para o meu curso de sistema operacional. mas eu não consigo ler o conteúdo de um arquivo. Só parece ler o que eu entro em resposta à pergunta. Não tenho certeza do que estou perdendo (assista ser super simples). obrigado antecipadamente.

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
    
por Papercuts Ink 11.11.2016 / 02:20

2 respostas

1

O script que você escreveu contará as linhas etc. na string digitada pelo usuário, não no arquivo correspondente a esse nome de arquivo.

Este é um script que faz o que você quer, e também reclama se o arquivo não existe ou não é um arquivo normal:

#!/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"

Para evitar chamar wc três vezes:

#!/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" )

Isso usa o fato de que wc , por padrão, gera o número de linhas, palavras e caracteres. Isso seria suficiente se você quer que eles sejam exibidos assim.

    
por 03.02.2017 / 10:21
0

Este código não está lendo o conteúdo do arquivo. O que você está fazendo em seu script é obter um nome de arquivo do usuário e, em seguida, armazená-lo em uma variável ( $file e posterior $mystring ).

Quando você executa for token in $mystring , está percorrendo o conteúdo da variável $mystring como uma lista, mas só tem o nome do arquivo que o usuário digitou. Assim, todos os comandos que fazem referência a $token estão manipulando a cadeia você obteve do seu usuário.

Para manipular o conteúdo do arquivo, você pode usar cat como apontado por @faadi: mystring=$(cat $file) .

EDITAR:

Apenas corrigindo algo na resposta. Eu me concentrei em você não ler o arquivo e não resolveu outro problema, criado por @steeldriver em seu comentário. Se você simplesmente alterar a linha de mystring=$file para mystring=$(cat $file) , ainda assim não conseguirá o que deseja, porque acabará dividindo o conteúdo do arquivo em uma lista e executando wc sobre eles.

Você pode remover o loop for, tendo isso (se quiser armazenar o texto em uma variável e usar 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

Ou, como sugerido pelo @steeldriver, basta redirecionar o arquivo para o STDIN de wc da seguinte forma:

#!/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
    
por 11.11.2016 / 02:53