sorting3列,并获得平均水平

当我运行我的testing.sh文件

#!/bin/bash FILE=$1 COUNT=0 while read -r SID FIRST LAST S1 S2 S3 do SUM=$(expr $S1 + $S2 + $S3) AVG=$(expr $SUM / 3) printf '%d [%d] %s, %s\n' "$AVG" "$SID" "$LAST" "$FIRST" done < "$FILE" | sort -k 3,3n -k 4,4n -k 2,2g 

我得到以下错误。

 expr: non-integer argument expr: syntax error 

我不确定我做错了什么。 我也试过echo,awk和bc,但是我也遇到了类似的错误。

我运行这样的文件:

/testing.sh /home/user/Desktop/sample.txt

这是示例文本。

 123456789 Lee Johnson 72 85 90 999999999 Jaime Smith 90 92 91 888111818 JC Forney 100 81 97 290010111 Terry Lee 100 99 100 199144454 Tracey Camp 77 84 84 299226663 Laney Camp 70 74 71 434401929 Skyler Camp 78 81 82 928441032 Jess Forester 85 80 82 928441032 Chris Forester 97 94 89 

当我运行我的程序时,这应该是输出:

 71 [299226663] Camp, Laney 80 [434401929] Camp, Skyler 81 [199144454] Camp, Tracey 93 [928441032] Forester, Chris 82 [928441032] Forester, Jess 92 [888111818] Forney, JC 82 [123456789] Johnson, Lee 99 [290010111] Lee, Terry 91 [999999999] Smith, Jaime 

你的S3实际上并不包含90的值,而是包含90$'\r'等值,因为你的输入文件有CRLF(DOS)而不是LF(UNIX)换行符。 如果您从非UNIX系统获得输入文件,最常发生这种情况。

使用dos2unix或vim命令等工具修复文件:set fileformat=unix ,或者在脚本中使用与以下代码类似的代码:

 S3=${S3%$'\r'} # remove any trailing $'\r' from S3