열 3의 최소값과 최대값을 찾고 전체 행을 인쇄합니다.

열 3의 최소값과 최대값을 찾고 전체 행을 인쇄합니다.

3개의 열로 구성된 대규모 데이터 세트가 있습니다. 세 번째 열에서 최대값과 최소값을 찾은 다음(0과 음수가 혼합되어 있으므로 최대값과 최소 음수값을 찾고 싶습니다) 해당 특정 행을 인쇄할 수 있기를 원합니다. 어떻게 해야 하나요?

입력 예:

-6.4 -3.6 -0.00
-6.4 -3.5 -0.00
-6.4 -3.5 -0.00
-6.4 -3.5 -0.00
.
.
.
-2.4 -1.6 -14.50
-2.4 -1.5 -14.49
-2.4 -1.5 -14.49
-2.4 -1.5 -14.49
.
.
.
-5.4 -2.6 -4.52
-5.4 -2.6 -4.53
-5.4 -2.6 -4.50
-5.4 -2.6 -0.00
-5.4 -2.6 -0.00

출력: 최소: -2.4 -1.6 -14.50

최대값: -5.4 -2.6 -4.50

답변1

답변을 수락했지만 더 쉬운 방법은 다음과 같습니다.

egrep -v "0.00|^\." file.txt | awk 'NR==1 {print "min:",$0} END{print"max:",$0}'

산출:

min: -2.4 -1.6 -14.50
max: -5.4 -2.6 -4.50

- 0이 필요하지 않기 때문에 실제로 가장 큰 숫자이더라도 이 egrep -v명령은 0.00을 포함하고 "."로 시작하는 줄을 제외한 모든 줄을 인쇄합니다.

- 위의 작업이 완료되면 행이 작은 것부터 큰 것 순으로 정리되었습니다. awk그런 다음 "min:" 접두사가 있는 첫 번째 줄과 "max:" 접두사가 있는 마지막 줄을 인쇄합니다.

해당 열의 값이 순서가 잘못된 경우 sort -k3명령 뒤에 파이프한 다음(정렬하려는 세 번째 열이라고 가정) 이를 뒤따르는 명령 egrep에 파이프 할 수 있습니다.awk

답변2

이를 위해서는 Python을 사용하는 것이 좋습니다. 데이터가 공간으로 구분되어 있으면 매우 간단합니다.

minVal = None
maxVal = None
with open('file') as f:
  for line in f:
    # default: split on whitespace.
    third = int(line.split()[2])
    if not minVal:
      # initialize the values
      minVal = third
      maxVal = third
    else:
      minVal = min(third, minVal)
      maxVal = max(third, maxVal)

print("min", minVal)
print("max", maxVal)

편집하다: 전체 행을 원할 경우 minRow합계를 저장해야 합니다 maxRow. 과거에는 이런 일을 해야 할 때 맞춤 최소/최대 함수를 사용했습니다. 둘 다 key매개변수를 사용하여 사용자 정의 함수를 지정합니다.

답변3

awk를 사용해 볼 수 있습니다.

awk -v 'f=1' '
  NF==3 {
    min = min < $3 ? min : $3
    if ( min != oldmin ) {
      a = $0
      oldmin = min
      }
    if ( $3 < 0 ) {
      if ( f ) {
        max = min
        f = 0
      }
      max = max > $3 ? max : $3
    }
    if ( max != oldmax ) {
      oldmax = max
      b = $0
      }
    }
  END {
    print "min : " a RS "max : " b
    }
' infile

관련 정보