使用bash脚本出现SUM问题

时间:2016-08-19 02:05:58

标签: bash perl awk sed sum

我正在尝试编写一个脚本来从4个文件中提取整数,这些文件存储来自4个工业冰柜的温度读数,这是一个爱好脚本,它会生成我想要的一般读数,但是当我尝试生成SUM时温度读数我得到以下打印输出到文件中,我的目标是打印结束SUM而不是以垂直格式打印的单个数字 任何帮助将不胜感激;这是我的代码

grep -o "[0.00-9.99]" "/location/$value-1.txt" | awk '{ SUM += $1; print $1} END { print SUM }' >> "/location/$value-1.txt"

这是我得到的回报

    Morningtemp:17.28
Noontemp:17.01
Lowtemp:17.00 Hightemp:18.72
1
7
.
2
8
1
7
.
0
1
1
7
.
0
0
1
8
.
7
2
53

它确实生成了SUM我不需要已经列出的数字,只需要SUM总和

2 个答案:

答案 0 :(得分:1)

grep -o "[0.00-9.99]" "/location/$value-1.txt"中的正则表达式相当于[0-9.],但您可能正在寻找0.00到9.99范围内的数字。为此,您需要一个不同的正则表达式:

grep -o "[0-9]\.[0-9][0-9]" "/location/$value-1.txt"

它会查找一个数字,一个点和两个以上的数字。使用[.]代替\.几乎是诱人的;它也会奏效。普通.不会;这将选择诸如0X87之类的条目。

请注意,显示的模式([0-9]\.[0-9][0-9])将匹配192.16.24.231两次(2.164.23)。如果这不是你想要的,你必须更准确。 OTOH,对于您拥有的实际数据,可能无关紧要。如果您希望它与192.1624.231(或.24.231)匹配,则必须优化正则表达式。

您的命令结构:

grep … filename | awk '…' >> filename

生活危险。在示例中,它是'OK'(但是当我输入'OK'时,我的脸上有一个巨大的鬼脸),因为awk脚本在grep读取之前不会向文件写入任何内容所有。但是将>>更改为>并且您有一个空输入,或者在awk完成之前有grep写材料,突然之间确定会发生什么变得非常棘手(它部分取决于awk写入文件末尾的内容。

答案 1 :(得分:1)

为什么不完全坚持使用AWK?代码:

$ cat > summer.awk 
{
    while(match($0,/[0-9]+\.[0-9]+/))    # while matches on record
    {
        sum+=substr($0, RSTART, RLENGTH) # extract matches and sum them
        $0=substr($0, RSTART + RLENGTH)  # reset to start after previous match
        count++                          # count matches
    }
} 
END {
    print sum"/"count"="sum/count        # print stuff

数据:

$ cat > data.txt
    Morningtemp:17.28
Noontemp:17.01
Lowtemp:17.00 Hightemp:18.72

执行命令

$ awk -f summer.awk file
70.01/4=17.5025

它也可能在冬天起作用。