서로 다른 숫자가 포함된 여러 문서 중에서 가장 큰 숫자를 찾는 방법

서로 다른 숫자가 포함된 여러 문서 중에서 가장 큰 숫자를 찾는 방법

예를 들어, 이 폴더에는 서로 다른 시간의 일부 온도 데이터가 있습니다. 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의 분할 기능을 활용하여 필드를 분할하고 숫자를 역순으로 정렬하여 가장 큰 숫자를 맨 위로 표시합니다.

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

관련 정보