
열 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
답변1
이것은 작동합니다:
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
이 솔루션을 미리 테스트 하지 않았 으며 이를 제공한 것은 정말 제 잘못입니다. 어쨌든, 답변의 편집된 버전이 작동해야 합니다(수정해 준 terdon에게 감사드립니다). 또한 다음도 테스트했습니다.
sort -nrk1,1 filename | head -1 | cut -d ' ' -f3
나는 sort
첫 번째 필드에 있어요.
- -n은 숫자 정렬을 지정합니다.
- -r은 역순 정렬 결과를 지정합니다.
- -k1,1은 정렬할 첫 번째 필드를 지정합니다.
이제 정렬 후 출력을 파이핑하고 첫 번째 결과를 얻었습니다. 그러면 결과의 열 1에 대해 수치적으로 가장 높은 값이 제공됩니다.
이제 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
답변2
이 작업을 수행하는 데 사용할 수 있습니다 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
변수를 인쇄합니다.
답변3
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log
답변4
sort
명령을 사용하여 정렬하면 됩니다.
sort -r version.log | head -n1 | awk '{print $2}'
산출:
/opt/oracle/app/oracle/product/12.1.0