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
변수에 저장합니다 . 그런 다음 다음 행을 명시적으로 읽고 첫 번째 열에 최소값과 새 값을 인쇄하고 두 번째 열에 최대 값과 새 값을 인쇄합니다.a
b
a
b
($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
그런 다음 결과는 표준 출력으로 전송됩니다.