我正在尝试编写一个脚本来从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总和
答案 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.16
和4.23
)。如果这不是你想要的,你必须更准确。 OTOH,对于您拥有的实际数据,可能无关紧要。如果您希望它与192.16
和24.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
它也可能在冬天起作用。