Como descobrir o maior número em muitos documentos que contém números diferentes

3

Por exemplo, existem alguns dados de temperatura nessas pastas em horário diferente. temps.txt contém o número da temperatura. Então, como posso usar o script bash para descobrir a temperatura máxima? (os resultados mostram apenas a data, a hora e o número da temperatura, por exemplo, ./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
    
por Yunong 27.11.2014 / 01:37

3 respostas

4

Você pode usar o comando find , grep e awk da combinação para obter o resultado desejado. O abaixo é um oneliner que irá imprimir o arquivo que tem a temperatura máxima registrada.

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)}'

Saída

./2012.04.16/00:10/temps.txt

Abaixo está a versão script do oneliner.

#!/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}"
    
por 27.11.2014 / 06:11
0

Com o GNU grep , assumindo que nenhum caminho de arquivo contém caracteres de nova linha:

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

Esta solução faz uso da função split no awk para dividir os campos e fazer a ordenação reversa numérica para estourar o número máximo para o topo.

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