簡體   English   中英

Unix bash腳本排序

[英]Unix bash scripting sort

我需要幫助來計算和顯示一組輸入數字的最大和平均值。

該程序應接受一組數字,每個數字最多3位。

例如,輸入246、321、16、10、12345、4、274和0應該導致321最大,而平均值為145,並顯示一條錯誤消息,指出12345無效。

任何想法如何在bash中排序? 抱歉,我不是一個低水平的開發人員,任何幫助都很棒:)

我看到您要求一個Bash解決方案,但是由於您在Unix也對其進行了標記,因此我建議使用純awk解決方案( awk對於此類問題非常理想):

awk '
  {
    if(length($1) <= 3 && $1 ~ /^[0-9]+$/) {
      if($1 > MAX) {MAX = $1}
      SUM+=$1
      N++
      print $1, N, SUM
    } else {
      print "Illegal Input " $1
    }
  }
  END {
    print "Average: " SUM / N
    print "Max: " MAX
  }
' < <(echo -e "246\n321\n16\n10\n12345\n4\n274\n0")

版畫

246 1 246
321 2 567
16 3 583
10 4 593
Illegal Input 12345
4 5 597
274 6 871
0 7 871
Average: 124.429
Max: 321

但是,我不明白為什么上面的輸入平均產生145?

tmpfile=`mktemp`
while read line ; do
  if [[ $line =~ ^[0-9]{1,3}$ ]] ; then 
    # valid input
    if [ $line == "0" ] ; then
      break
    fi  
    echo $line >> $tmpfile
  else 
    echo "ERROR: invalid input '$line'"
  fi  
done
awk ' { tot += $1; if (max < $1) max = $1; } \
  END { print tot / NR; print max; } ' $tmpfile
rm $tmpfile 

帶有bc管道化coreutils選項:

echo 246 321 16 10 12345 4 274 0           \
| grep -o '\b[0-9]{1,3}\b'                 \
| tee >(sort -n | tail -n1 > /tmp/max)     \
| tr '\n' ' '                              \
| tee >(sed 's/ $//; s/ \+/+/g' > /tmp/add) \
      >(wc -w > /tmp/len) > /dev/null

printf "Max: %d, Min: %.2f\n" \
  $(< /tmp/max)               \
  $((echo -n '('; cat /tmp/add; echo -n ')/'; cat /tmp/len) | bc -l)

輸出:

Max: 321, Min: 124.43
  • grep確保數字格式約束。
  • sort chepner的建議, sort找到最大值
  • sedwc生成總和和除數。

請注意,這會生成3個臨時文件: /tmp/{max,add,len} ,因此您可能要使用mktemp和/或delete:

rm /tmp/{max,add,len}

編輯

如果您想了解無效輸入,請將其粘貼到管道的前面:

tee >(tr ' ' '\n'            \
      | grep -v '\b.{1,3}\b' \
      | sed 's/^/Invalid input: /' > /tmp/err)

然后在printf之后執行cat /tmp/err

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM