두 번째 열의 최대값과 첫 번째 열의 최소값을 한 번에 두 행을 비교합니다.

두 번째 열의 최대값과 첫 번째 열의 최소값을 한 번에 두 행을 비교합니다.
5500 5700
5600 5800
5700 5800
5600 5900
5900 6100
5900 6100
5900 6100
5800 6000
5800 6100
5900 6100
5800 6200
5700 5800

위에서 설명한 대로 두 개의 열이 있는 파일이 있습니다. 첫 번째 열의 두 행마다 최소값을 찾고 두 번째 열의 두 행마다 최대값을 찾아야 합니다. awk를 사용하여 이를 달성하는 방법은 무엇입니까? 원하는 출력은

Min      Max
5500     5800
5600     5900
5900     6100
5800     6100
5800     6100
5700     6200  

답변1

$ awk 'BEGIN { print "Min", "Max" } {a=$1; b=$2; getline; print ($1<a?$1:a), ($2>b?$2:b)}' data.in
Min Max
5500 5800
5600 5900
5900 6100
5800 6100
5800 6100
5700 6200

이 코드는 첫 번째 열과 두 번째 열의 현재 값을 각각 및 awk변수에 저장합니다 . 그런 다음 다음 행을 명시적으로 읽고 첫 번째 열에 최소값과 새 값을 인쇄하고 두 번째 열에 최대 값과 새 값을 인쇄합니다.abab

($1 < a ? $1 : a)삼항 연산자를 사용하여 ?:비교 결과에 따라 값을 비교하고 선택합니다.

탭으로 구분된 출력을 원하는 경우:

$ awk 'BEGIN {OFS="\t"; print "Min", "Max"} {a=$1; b=$2; getline; print ($1<a?$1:a), ($2>b?$2:b)}' data.in
Min     Max
5500    5800
5600    5900
5900    6100
5800    6100
5800    6100
5700    6200

답변2

perl -pe '($_ .= <>) =~ s/(\d+) (\d+)\n(\d+) (\d+)/($3<$1 ? $3:$1).$".($4>$2 ? $4:$2)/e'

현재 레코드에 다음 행을 추가한 $_다음 필드 3<->1(최소값)과 4<->2(최대값)을 비교하고 결과를 레코드 자체에 넣습니다. -p그런 다음 결과는 표준 출력으로 전송됩니다.

관련 정보