주어진 데이터에서 가장 큰 양수를 찾으십니까?

주어진 데이터에서 가장 큰 양수를 찾으십니까?

누군가 awk, sed 또는 일부 유닉스 쉘 프로그램을 사용하여 가장 큰 양수를 찾는 방법을 말해 줄 수 있습니까? 저는 Linux RHEL과 KSH를 사용하고 있습니다. 입력에는 8개의 데이터 열이 있을 수 있으며 N/A는 가능한 값 중 하나입니다.

SAMPLE INPUT

1252.2          1251.8          N/A             N/A 
-31.9           -33.2           N/A             N/A 
-1172.4         -1174.4         N/A             N/A 
-6.5            -6.4            N/A             N/A 
-.3             -.3             N/A             N/A 
1351.8          1351.8          N/A             N/A 
38.3            38.0            N/A             N/A 
-21.6           -21.9           N/A             N/A 
-4.7            -4.5            N/A             N/A 
-5.0            -2.9            N/A             N/A 
3.1             3.3             N/A             N/A 
-20.1           -20.3           N/A             N/A 
-199.1          -199.3          N/A             N/A 
346.5           346.7           N/A             N/A 
-.8             -.4             N/A             N/A 
14.8            14.7            N/A             N/A 
8.4             8.4             N/A             N/A 
-18.2           -18.2           N/A             N/A 
-43.7           -43.6           N/A             N/A 

원하는 출력

Largest number is 1351.8

답변1

Awk를 사용하여 N/A항목에 대한 수치 계산을 강제합니다.

awk '{for (i=1;i<=NF;i++) max = $i+0 > max ? $i : max} END{print "Largest number is " max}' data

답변2

한 가지 접근 방식은 다음과 같습니다.

perl -lane '$_>$m and $m=$_ for @F}{print $m' sample.txt

설명하다:

  1. -n옵션은 입력 파일을 한 줄씩 처리합니다.

  2. -e옵션은 입력 읽기의 각 행에 따라 Perl 코드를 적용합니다.

  3. -a옵션은 개별 필드를 읽을 때 각 행을 분할하여 배열에 저장합니다 @F.

  4. -l옵션은 RS=ORS="\n"을 만듭니다.

  5. for @F각 필드는 현재 필드가 에 저장되어 반복됩니다 $_.

  6. 현재 필드를 최대값과 비교하여 최대값을 초과하면 최대값을 업데이트합니다.

  7. 비교가 끝나면}{max의 내용을 인쇄합니다.

  8. 숫자 컨텍스트에서 s는 N/A0으로 처리되어야 하므로 처음부터 모든 숫자가 음수가 아닌 한 결과에 영향을 미치지 않습니다.

답변3

tr, 및를 사용하는 sortbash 스타일 솔루션head

echo $(< file) | tr ' ' '\n' | sort -rn | head -1
  • echo $(< file)파일을 읽고 결과를 에코합니다. 하지만 주위에 따옴표를 넣지 않았기 때문에( echo "$(< file)"와 동일 cat file) 내용은 개행 문자가 제거되고 공백이 압축된 긴 문자열입니다.
  • | tr ' ' '\n'tr각 공백 문자를 개행 문자로 바꿔 결과를 전달합니다.
  • | sort -rn결과를 에 파이프하고 sort모든 행을 역순(-r) 숫자(-n) 순서(가장 큰 숫자부터)로 정렬합니다.
  • | head -1결과를 head출력의 첫 번째 줄에 파이프합니다.

답변4

다음 메소드 명령을 통해 수행했습니다.

awk '{print $0}' o.txt | sed -r "s/\s+/\n/g"| sed '/^$/d'| sort | uniq| sed -n '/[0-9]/p'| awk 'BEGIN{sum=0;m=" "}($1 >sum){sum=$1}{m=sum}END{print m}'

산출

 awk '{print $0}' o.txt | sed -r "s/\s+/\n/g"| sed '/^$/d'| sort | uniq| sed -n '/[0-9]/p'| awk 'BEGIN{sum=0;m=" "}($1 >sum){sum=$1}{m=sum}END{print m}' 

산출

1351.8

관련 정보