排序3列并获得平均值

时间:2016-09-08 22:32:38

标签: linux bash unix

当我运行我的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

1 个答案:

答案 0 :(得分:4)

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

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

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