Shell中的數值計算

來源:互聯網
上載者:User

標籤:

#!/bin/bashecho "please input number:"read na=`expr $n / 100`#a1=`expr $n - $a * 100`b=`echo "($n-$a*100)/10" | bc`c=`echo "($n-$a*100-$b*10)" | bc` d=`echo "$c*100+$b*10+$a" | bc`echo $d轉:http://bbs.techrepublic.com.cn/viewthread.php?tid=1404251.對某個數加一$ i=0;$ ((i++))$ echo $i1$ let i++$ echo $i2$ expr $i + 13$ echo $i2$ echo $i 1 | awk ‘{printf $1+$2}‘ let i++;i=$(expr $i + 1)i=$(echo $i+1|bc)i=$(echo "$i 1" | awk ‘{printf $1+$2;}‘)  2.用time統計指令碼已耗用時間$ time calc.sh10000 real    0m1.319suser    0m1.056ssys     0m0.036s$ time calc_let.sh3.用shell的內建命令查看各個命令的類型如下:$ type typetype is a shell builtin$ type letlet is a shell builtin$ type exprexpr is hashed (/usr/bin/expr)$ type bcbc is hashed (/usr/bin/bc)$ type awkawk is /usr/bin/awk4.let,expr,bc都可以用來求模,運算子都是%,而let和bc可以用來求冪,運算子不一樣,前者是**,後者是^//求模$ expr 5 % 21$ let i=5%2$ echo $i1$ echo 5 % 2 | bc1$ ((i=5%2))$ echo $i1//求冪$ let i=5**2$ echo $i25$ ((i=5**2))$ echo $i25$ echo "5^2" | bc25 5.浮點預算,let和expr都無法進行浮點運算,但是bc和awk可以。例一:   $ echo "scale=3; 1/13"  | bc    .076   $ echo "1 13" | awk ‘{printf("%0.3f\n",$1/$2)}‘    0.077例二:$ echo 1/13100 | bc -l.00007633587786259541 例三:假如有這樣一組資料,存放有某個村莊所有家庭的人數和月總收入,要求找 出人均月收入最高的家庭。檔案名稱為innode1 3 44902 5 38963 4 31124 4 47165 4 45786 6 53997 3 50898 6 30299 4 619510 5 5145註:通過下面指令碼產生上面三列隨機數:for i in $(seq 1 10);do echo $i $(($RANDOM/8192+3)) $((RANDOM/10+3000));done 說明:上面的三列資料分別是家庭編號、家庭人數、家庭月總收入。分析:為了求出月均收入最高的家庭,我們需要對後面兩列數進行除法運算,即求出每個家庭的月均收入,然後按照月均收入排序,找出收入最高的家庭。 #!/bin/bash# gettopfamily.sh[ $# -lt 1 ] && echo "please input the file who store the income data" && exit -1[ ! -f $1 ] && echo "$1 is not a file" && exit -1income=$1awk ‘{        printf("%d %0.2f\n", $1, $3/$2);}‘ $income | sort -k 2 -n -r 6.產生一個隨機數環境變數RANDOM產生0到32767的隨機數,而awk的rand函數可以產生0到1之間的隨機數。例一:$ echo $RANDOM81$ echo "" | awk ‘{srand(); printf("%f", rand());}‘0.237788說明:srand在無參數時,採用目前時間作為rand隨機數產生器的一個seed 7.統計某篇文章中單詞出現的個數:cat text | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | uniq -c 8.統計出出現頻率最高的前10個單詞cat text | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | uniq -c | sort -n -k 1 -r | head -10 說明:cat text: 顯示text檔案裡的內容sed -e "s/[^a-zA-Z]/\n/g": 把非字母的字元全部替換成空格,這樣整個文本只剩下字母字元grep -v ^$:去掉空行sort: 排序uniq -c:統計相同行的個數,即每個單詞的個數sort -n -k 1 -r:按照第一列(-k 1)的數字(-n)逆序(-r)排序head -10:取出前十行9.統計文章裡含有的指定單詞的數量代碼一#!/bin/bash# statistic_words.shif [ $# -lt 1 ]; then        echo "ERROR: you should input 2 words at least";        echo "Usage: basename $0 FILE WORDS ...."       exit -1fiFILE=$1((WORDS_NUM=$#-1))for n in $(seq $WORDS_NUM)do    shift    cat $FILE | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | grep ^$1$ | uniq -cdone代碼二#!/bin/bash# statistic_words.shif [ $# -lt 1 ]; then        echo "ERROR: you should input 2 words at least";        echo "Usage: basename $0 FILE WORDS ...."        exit -1fiFILE=$1((WORDS_NUM=$#-1))for n in $(seq $WORDS_NUM)do    shift    cat $FILE | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | uniq -c | grep " $1$"done 說明:很明顯,採用第一種辦法效率要高很多,因為第一種辦法提前找出了需要統計的單詞,然後再統計,而後者則不然。實際上,如果使用grep的-E選項, 我們無須引入迴圈,而用一條命令就可以搞定:$ cat text | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | grep -E "^Action$|^is$" | uniq-c或者$ cat text | sed -e "s/[^a-zA-Z]/\n/g" | grep -v ^$ | sort | egrep  "^Action$|^is$" | uniq-c 補充:在《進階Bash指令碼編程指南》一書中還提到jot命令和factor命令factor產生一個數的所有素數

Shell中的數值計算

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.