異なる数字を含む複数の文書の中で最大数を見つける方法

異なる数字を含む複数の文書の中で最大数を見つける方法

たとえば、このフォルダには異なる時間のいくつかの温度データがあります。 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

findgrepおよびコマンドの組み合わせを使用して、目的のawk結果を得ることができます。以下は、記録された最高温度でファイルを印刷する1行のコードです。

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の分割機能を利用してフィールドを分割し、数字を逆順に並べ替えて、最大の数字を一番上に表示します。

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

関連情報