如何找出多个包含不同数字的文档中最大的数字

如何找出多个包含不同数字的文档中最大的数字

例如,这些文件夹中有一些不同时间的温度数据。 temps.txt包含温度数字。那么如何使用bash脚本找出最高温度呢? (结果仅显示日期、时间和温度数字,例如./2011.10.20/00:00/temps.txt 27C)。

$ ls
2011.10.20  2012.01.20  2012.04.16  2012.07.12  2012.10.07
2011.10.21  2012.01.21  2012.04.17  2012.07.13  2012.10.08
2011.10.22  2012.01.22  2012.04.18  2012.07.14  2012.10.09
$ cd 2011.10.20

$ ls    
00:00   02:25   04:50   07:15   09:40   12:05   14:30   16:55   19:20   21:45
00:05   02:30   04:55   07:20   09:45   12:10   14:35   17:00   19:25   21:50
00:10   02:35   05:00   07:25   09:50   12:15   14:40   17:05   19:30   21:55
$ cd 00:00
$ ls
temps.txt
$ cat temps.txt
Sensor   Location              Temp
------   --------              ----
#1        PROCESSOR_ZONE       27C/80F

答案1

find您可以使用,grep和命令组合awk来获得所需的结果。下面是一个单行代码,它将打印记录了最高温度的文件。

find . -mindepth 3 -exec echo -n "{} " \; -exec grep "PROCESSOR_ZONE" {} \; |
awk '{
    split($4,val,"/");
    gsub("C","",val[1]);
    if (max<val[1]) {file=$1; max=val[1]}
} END {print(file)}'

输出

./2012.04.16/00:10/temps.txt

以下是scriptoneliner 的版本。

#!/bin/bash

# The path where temperature directories and files are kept
path="/tmp/tmp.ADntEuTlUT/"

# Temp file
tempfile=$(mktemp)

# Get the list of files name and their corresponding
# temperature data.
find "${path}" -mindepth 3 -exec echo -n "{} " \; -exec grep "PROCESSOR_ZONE" {} \; > "${tempfile}"

# Parse though the temp file to find the maximum 
# temperature based on Celsius
awk '{split($4,val,"/");gsub("C","",val[1]);if(max<val[1]){file=$1;max=val[1]}} END{print(file)}' "${tempfile}"

# Removing the temp file
rm -f "${tempfile}"

答案2

对于 GNU grep,假设没有文件路径包含换行符:

grep -rHPo 'PROCESSOR_ZONE\s+\K\d+C' . | awk -F: '
   0+$NF >= max {max = $NF; text = $0}; END {print text}'

答案3

该解决方案利用 awk 中的 split 函数来分割字段并进行数字反向排序以将最大数字弹出到顶部。

find . -name "temps.txt" -print|xargs tail -n 1 | awk '{split($NF,temp,"[CF/]");print temp[1]}'|sort -r | head -n 1

相关内容