열 1의 최대 값을 찾고 파일에서 열 2의 각 레코드를 인쇄하십시오.


19

열 1에서 최대 값을 찾고 n 개의 레코드가 포함 된 파일에서 해당 경로 위치를 에코하는 방법

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0

예상 출력 :

/opt/oracle/app/oracle/product/12.1.0

답변:


23

이것은 작동해야합니다 :

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

-v max=0세트는 가변 max하는 0, 그리고, 라인마다, 제 필드의 현재 값과 비교된다 max. 더 큰 경우 max, 첫 번째 필드의 값으로 want설정되고 현재 행으로 설정됩니다. 프로그램이 전체 파일을 처리하면 현재 값 want이 인쇄됩니다.

편집하다

나는 awk솔루션을 더 일찍 테스트하지 않았 으며 그것을 제공하는 것은 정말로 나빴다. 어쨌든 편집 된 버전의 답변이 작동해야하며 (고치 줘서 고맙습니다) 아래도 테스트했습니다.

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

나는 sort첫 번째 분야에서 간다,

  • -n은 숫자 정렬을 지정합니다.
  • -r은 정렬 결과를 반대로 지정합니다.
  • -k1,1은 정렬 할 첫 번째 필드를 지정합니다.

이제 정렬 후 출력을 파이핑하고 첫 번째 결과를 얻습니다. 결과에서 column1의 숫자가 가장 높은 값을 얻습니다.

이제 마지막 cut으로 공간으로 지정된 구분 기호로 파이프 -f3하고 원하는 출력을 인쇄합니다 .

테스팅

cat filename
112030   /opt/oracle/app/oracle/product/11.2.0
121010   /opt/oracle/app/oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

이제 위와 같이 입력에 대해 위 명령을 실행하면 출력이 다음과 같이 나타납니다.

/Max/number

awk max는 문자열 필드를 숫자로 비교하지 않습니다. 왜 당신이 두 번째 접근 방식을 썼습니까?
Sajuuk

7

당신은 그것을 할 수 있습니다 AWK.

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/oracle/app/oracle/product/12.1.0

여기서 각 줄의 첫 번째 열은 변수 max(처음 0) 와 비교됩니다 . 첫 번째 열에 큰 값이 있으면 max두 번째 열이 변수에 저장되고 line파일의 모든 줄마다 계속됩니다.

파일 END규칙 의 끝 에서 line변수 를 인쇄하기 위해 실행됩니다 .


4
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log

3

sort -k1 -n filename | tail -1 | awk '{print $2}'


1
이 작업은 효과가 있지만 비효율적입니다. 작업이 최대 값을 찾으려면 정렬이 과도하기 때문입니다.
jw013

2

간단히 sort명령 을 사용하여 정렬 할 수 있습니다

sort -r version.log | head -n1 | awk '{print $2}'

산출:

/opt/oracle/app/oracle/product/12.1.0

두 번째 값만 인쇄하려면이 cat version.log | 정렬 -r | 헤드 -n1 | awk -F "" '{Print $ 2}'
보안 야수

터미널의 스크린 샷을 게시하지 마십시오. 대신 텍스트를 붙여 넣으십시오. 또한 필요가 없습니다 cat. sort는 입력 파일을 직접 가져올 수 있습니다.
terdon

-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’

2
이것은 받아 들인 대답의 다시 해시처럼 보입니까? 어떻게 다른지 설명 해주세요.
Stephen Rauch

실제로, 최소한 원저자에게 신용을 제공하십시오.
Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.