2012-01-05 40 views
10

Tôi phải viết một tập lệnh lấy một câu và in số đếm, số ký tự (không bao gồm khoảng trắng), độ dài của mỗi từ và độ dài. Tôi biết rằng có tồn tại wc -m để truy cập số ký tự trong từ, nhưng làm thế nào để sử dụng nó trong kịch bản?Couting ký tự, từ, chiều dài của các từ và tổng chiều dài trong câu

#!/bin/bash 

mystring="one two three test five" 
maxlen=0; 
for token in $mystring; do 
    echo -n "$token: "; 
    echo -n $token | wc -m; 
    if [ ${#token} -gt $maxlen ]; then 
     maxlen=${#token}; fi; 
done 

echo "--------------------------"; 
echo -n "Total words: "; 
echo "$mystring" | wc -w; 
echo -n "Total chars: "; 
echo "$mystring" | wc -m; 
echo -n "Max length: "; 
echo $maxlen 
+0

Âm thanh như [tag: bài tập về nhà]. Nếu có, vui lòng gắn thẻ như vậy.Đối với nhiều người trong chúng ta, nếu chúng ta thấy thẻ đó, chúng tôi sẽ nỗ lực nhiều hơn để giúp bạn tìm hiểu lý do tại sao câu trả lời là nó là gì, thay vì chỉ cung cấp giải pháp. – ghoti

+0

cảm ơn bạn, ghoti, sẽ đề cập thêm. Nhưng tôi chỉ thực hành với các kịch bản lệnh và lệnh shell – mydreamadsl

+0

Và câu hỏi của bạn là gì? – Raedwald

Trả lời

12

riffing về câu trả lời Jaypal Singh:

[email protected]:~$ mystring="one two three four five" 
[email protected]:~$ echo "string length: ${#mystring}" 
string length: 23 
[email protected]:~$ echo -n "lengths of words: "; i=0; for token in $mystring; do echo -n "${#token} "; i=$((i+1)); done; echo; echo "word count: $i" 
lengths of words: 3 3 5 4 4 
word count: 5 
[email protected]:~$ echo -n "maximum string length: "; maxlen=0; for token in $mystring; do if [ ${#token} -gt $maxlen ]; then maxlen=${#token}; fi; done; echo $maxlen 
maximum string length: 5 
+0

cảm ơn cho câu trả lời của bạn, làm thế nào tôi có thể xuất chỉ chiều dài tối đa? – mydreamadsl

+0

ý của bạn là gì theo "độ dài tối đa"? –

+0

giống như mã thông báo "ba" là từ lớn nhất trong chuỗi và chiều dài của nó là 5 – mydreamadsl

10
echo $mystring | wc -w 

hoặc

echo $mystring | wc --words 

sẽ làm một từ đếm cho bạn.

Bạn có thể đường ống mỗi từ để wc:

echo $token | wc -m 

để lưu trữ kết quả trong một biến:

mycount=`echo $token | wc -m` 
echo $mycount 

để thêm vào tổng số khi bạn đi từng chữ, làm toán với điều này cú pháp:

total=0 
#start of your loop 
total=$((total+mycount)) 
#end of your loop 
echo $total 
2

Bạn đang ở rất gần. Trong bash bạn có thể sử dụng # để nhận được độ dài của biến của bạn.

Ngoài ra, nếu bạn muốn sử dụng bash phiên dịch sử dụng bash thay vì sh và dòng đầu tiên đi như thế này -

#!/bin/bash

Sử dụng kịch bản này -

#!/bin/bash 

mystring="one two three test five" 
for token in $mystring 
do 
    if [ $token = "one" ] 
    then 
     echo ${#token} 
    elif [ $token = "two" ] 
    then 
     echo ${#token} 
    elif [ $token = "three" ] 
    then 
     echo ${#token} 
    elif [ $token = "test" ] 
    then 
     echo ${#token} 
    elif [ $token = "five" ] 
    then 
     echo ${#token} 
    fi 
done 
+0

Có một vài cách để làm số học trong trình bao. Tôi thích 'foo = $ ((bar + 1))' – mkb

3
#!/bin/bash 

mystring="one two three test five" 
for token in $mystring; do 
    echo -n "$token: "; 
    echo -n $token | wc -m; 
done 
echo "--------------------------"; 
echo -n "Total words: "; 
echo "$mystring" | wc -w; 
echo -n "Total chars: "; 
echo "$mystring" | wc -m; 
+0

Wow, cool, thanks!) Làm thế nào tôi có thể kiểm tra độ dài tối đa của từ trong toàn bộ chuỗi? – mydreamadsl

3
string="i am a string" 

n=$(echo $string | wc -w) 

echo $n 

4 

Giá trị của n có thể là sử dụng như một số nguyên trong các biểu thức

eg. 

echo $((n+1)) 
5 
0

Lệnh wc là đặt cược tốt.

$ echo "one two three four five" | wc 
     1  5  24 

trong đó kết quả là số dòng, từ và ký tự. Trong một kịch bản:

#!/bin/sh 

mystring="one two three four five" 

read lines words chars <<< `wc <<< $mystring` 

echo "lines: $lines" 
echo "words: $words" 
echo "chars: $chars" 

echo -n "word lengths:" 
declare -i nonspace=0 
declare -i longest=0 
for word in $mystring; do 
    echo -n " ${#word}" 
    nonspace+=${#word}" 
    if [[ ${#word} -gt $longest ]]; then 
    longest=${#word} 
    fi 
done 
echo "" 
echo "nonspace chars: $nonspace" 
echo "longest word: $longest chars" 

Các declare built-in phôi một biến là một số nguyên ở đây, do đó += sẽ bổ sung chứ không phải nối thêm.

$ ./doit 
lines: 1 
words: 5 
chars: 24 
word lengths: 3 3 5 4 4 
nonspace chars: 19 
0

đang

var=(one two three) 
length=${#var[@]} 
echo $length 

đầu ra

3 
+2

Một lời giải thích ngắn gọn sẽ cải thiện câu trả lời này. –

+2

Tôi sẽ sớm giải thích nó. Trước tiên, tôi cần phải loại bỏ phụ lục của tôi (nghiêm túc). – Alan

Các vấn đề liên quan