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