मेरे पास नीचे दिया गया कोड है। मैं wc, awk, tr, आदि।

मैं शब्दों की कुल संख्या गिनने में सक्षम हूं, लेकिन यहां मेरे पास एक मुद्दा भी है: आउटपुट में मुझे कुल शब्द गणना नहीं मिल रही है, आउटपुट जो होना चाहिए उससे कम है।

मुझे क्या करना चाहिए?

#!/bin/bash
#v=1

echo -n "ENTER FILE NAME: "
read file
IFS=$'\n'
cnew_line=`echo -e "\n"`
cspace=`echo  " "`

if [ $# -ne 0 ] 
then

echo "You didn't entered a filename as a parameter"
exit

elif [ $# -eq 0 ] 
then
filename="$file"

num_line=0
num_word=0
num_char=0

while read -n1  w
do
if [ "$w" = "$cnew_line" ]
then
(( num_line++ ))
elif [ "$w" = "$cspace" ]
then

(( num_word++ ))

else
(( num_char++ ))
fi
done < "$filename"


echo "Line Number = $num_line"
echo "Word Number = $num_word"
echo "Character Number =$num_char"

fi

    enter code here
0
Anish Kumar 19 पद 2017, 08:24

2 जवाब

सबसे बढ़िया उत्तर

आप शब्दों को गिनने के लिए एक सहयोगी सरणी का उपयोग कर सकते हैं, कुछ इस तरह:

$ cat foo.sh
#!/bin/bash                                                                     

declare -A words

while read line
do
    for word in $line
    do
        ((words[$word]++))
    done
done

for i in "${!words[@]}"
do
    echo "$i:" "${words[$i]}"
done

इसका परीक्षण:

$ echo this is a test is this | bash foo.sh
is: 2
this: 2
a: 1
test: 1

यह उत्तर इन बेहतरीन उत्तरों से काफी हद तक निर्मित किया गया था: यह और यह. उन्हें अपवोट करना न भूलें।

0
James Brown 19 पद 2017, 09:30

जेम्स ब्राउन के उत्तर के दो उन्नत संस्करण, (जो विराम चिह्न को एक शब्द का हिस्सा मानता है, और दोहरे और एकल उद्धरणों के समूहों पर विराम देता है) ):

  1. विराम चिह्न शब्द का हिस्सा माना जाता है:

    #!/bin/bash
    declare -A words
    
    while read line ; do
        for word in ${line} ; do
            ((words[${word@Q}]++))
    done ; done
    
    for i in ${!words[@]} ; do
        echo ${i}: ${words[$i]}
    done
    
  2. विराम चिह्न शब्द का हिस्सा नहीं है, (जैसे wc):

    #!/bin/bash
    declare -A words
    
    while read line ; do
        line="${line//[[:punct:]]}"
        for word in ${line} ;do 
            ((words[${word}]++))
    done ; done
    
    for i in ${!words[@]} ;do
        echo ${i}: ${words[$i]}
    done
    

मुश्किल उद्धृत पाठ के साथ परीक्षण कोड:

  • fortune -m "swear" | bash foo.sh

  • man bash | ./foo.sh | sort -gr -k2 | head

0
agc 19 पद 2017, 19:45