#!/bin/bash字符串 f=member.txt ##人員列表,一行一我的員 member_n=`wc -l $f|awk '{print $1}'` group_n=7 ##7**2,人員數開平方get ## 根據人員姓名計算該成員所在小組的ID,即小組號 get_n() { ## 根據人員姓名計算cksum值,即根據字符串計算隨機數字,非隨機字符串 l=`echo $1|cksum|awk '{print $1}'` ## 獲取一個隨機數 n1=$RANDOM ## cksum值和隨機數相加,使隨機數更加隨機;而後除以小組數取餘;這樣每次得到的餘數都會不同(即人員分的組不同) n2=$[$l+$n1] g_id=$[$n2%$group_n] ## 假如小組數爲7,則餘數的範圍則是0-6,餘數爲0則小組id爲7 if [ $g_id -eq 0 ] then g_id=$group_n fi echo $g_id ## 函數返回值 }it ## 檢測n_$i.txt組臨時文件,用來記錄對應的每一個小組內的成員,n_3.txt用來記錄第3小組內的成員 for i in `seq 1 group_n` do ## 若是腳本執行過則該文件會存在,本次執行腳本前應該刪除該臨時文件,每次分組內的成員都不同 [ -f n_$i.txt ] && rm -f n_$i.txt donetable shuf $f|while read name do ## 計算人員所在組的ID,調用前面的函數 g=`get_n $name` ## 將人員寫入其對應的組臨時文件n_$i.txt中 echo "$name" >> n_$g.txt doneawk 定義計算組臨時文件n_$i.txt行數的函數 nu() { wc -l $1|awk '{print $1}' }變量 ## 定義函數:獲取小組人員數量的最大值 max() { ma=0 ## 小組內人員數量的最大值,最小是0 for i in `seq 1 $group_n|shuf` do n=`nu n_$i.txt` if [ $n -gt $ma ] then ma=$n fi done echo $ma } ## 定義函數:獲取小組人員數量的最小值 min() { mi=$member_n ## 小組內人員數量的最小值,最大是member_n,全部人員的總數量 for i in `seq 1 $group_n|shuf` do n=`nu n_$i.txt` if [ $n -lt $mi ] then mi=$n fi done echo $mi }隨機數 ## 定義四捨五入函數 div() { n=`echo "scale=1;$1/$2"|bc` ## 兩個數相除 n1=`echo "scale=1;$n+0.5"|bc` echo $n1|cut -d. -f1 } ## 小組組員數量的平均值(非四捨五入) ava_n=$[$member_n/$group_n] ## 小組組員數量的平均值(四捨五入) ava_n1=`div $member_n $group_n` if [ $ava_n -eq $ava_n1 ] then ## 定義初始最小值 ini_min=1 ## while循環:把人數多的組裏面的人員 轉移到 人數少的組裏去 ## 人數少的組的定義是:其組成員的數量 小於 小組組員數量的平均值 while [ $ini_min -lt $ava_n1 ] do m1=`max` ## 小組組員數量的最大值 m2=`min` for i in `seq 1 $group_n|shuf` do n=`nu n_$i.txt` ## 找出人數最多的組對應的組人員文件f1,可能有多個,這裏取出現的第一個便可 if [ $n -eq $m1 ] then f1=n_$i.txt ## 找出人數最多少的組對應的組人員文件f2,可能有多個,這裏取出現的第一個便可 else if [ $n -eq $m2 ] then f2=n_$i.txt fi done name=`tail -n1 $f1` ## 取人數最多的組人員文件f1的最後一我的名 echo "$name" >> $f2 sed -i "/$name/d" $1 ## 在組人員文件f1中刪除剛剛取走的人名 ## 把此時(轉移人員後)組員數量的最小值賦值給變量ini_min ini_min=`min` ## 調用min函數;循環後變量ini_min的值最接近變量ava_n1的值 done else ## 定義初始最大值 ini_max=$member_n ## while循環:把人數多的組裏面的人員 轉移到 人數少的組裏去 ## 人數多的組的定義是:其組成員的數量 大於 小組組員數量的平均值 while [ $ini_max -gt $ava_n1 ] do m1=`max` ## 小組組員數量的最大值 m2=`min` for i in `seq 1 $group_n|shuf` do n=`nu n_$i.txt` ## 找出人數最多的組對應的組人員文件f1,可能有多個,這裏取出現的第一個便可 if [ $n -eq $m1 ] then f1=n_$i.txt ## 找出人數最多少的組對應的組人員文件f2,可能有多個,這裏取出現的第一個便可 else if [ $n -eq $m2 ] then f2=n_$i.txt fi done name=`tail -n1 $f1` ## 取人數最多的組人員文件f1的最後一我的名 echo "$name" >> $f2 sed -i "/$name/d" $1 ## 在組人員文件f1中刪除剛剛取走的人名 ## 把此時(轉移人員後)組員數量的最小值賦值給變量ini_min ini_max=`max` ## 調用max函數;循環後變量ini_max的值最接近變量ava_n1的值 fi for i in `seq 1 $group_n` do echo -e "\033[34m$i 組成員有:\033[0m" ## 帶顏色輸出組成員 cat n_$i.txt ## 刪除組臨時文件 rm -f n_$i.txt echo done |