어떻게 제거할 수 있을 선택한 라인으로 awk 스크립트를 사용해야 할까요?

StackOverflow https://stackoverflow.com/questions/1646129

  •  22-07-2019
  •  | 
  •  

문제

나는 배관 프로그램의 출력을 통해 어떤 명령을 awk,나는 거의 어디에 내가 필요로 합니다.의 명령이 지금까지입니다:

myprogram | awk '/chk/ { if ( $12 > $13) printf("%s %d\n", $1, $12 - $13); else  printf("%s %d\n", $1, $13 - $12)  }  ' | awk '!x[$0]++'

마지막이 가난한 사람의 uniq, 는 사용할 수 없에 내 대상입니다.주어진 기회를 위의 명령을 생산하는 출력 이와 같은:

GR_CB20-chk_2, 0
GR_CB20-chk_2, 3
GR_CB200-chk_2, 0
GR_CB200-chk_2, 1
GR_HB20-chk_2, 0
GR_HB20-chk_2, 6
GR_HB20-chk_2, 0
GR_HB200-chk_2, 0
GR_MID20-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 0
GR_MID200-chk_2, 2

내가 무엇을 가지고 싶은 이것입니다:

GR_CB20-chk_2, 3
GR_CB200-chk_2, 1
GR_HB20-chk_2, 6
GR_HB200-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 2

는,나만 인쇄 라인을 최대 값을 지정한 꼬리표(첫 번째는'필드').위의 예제의 대표 데이터에서는 출력이 정렬(이 파이프를 통해 sort 명령).

도움이 되었습니까?

해결책

에 따라 나 응답 비슷한 필요한 이 스크립트는 일을 계속 순서에 축적되지 않은 큰 배열입니다.그것을 인쇄 라인과 함께 가장 높은 값에서 각 그룹이다.

#!/usr/bin/awk -f
{
    s = substr($0, 0, match($0, /,[^,]*$/))
    if (s != prevs) {
        if ( FNR > 1 ) print prevline
        prevval = $2
        prevline = $0
    }
    else if ( $2 > prevval ) {
        prevval = $2
        prevline = $0
    }
    prevs = s
}
END {
    print prevline
}

다른 팁

지 않는 경우에 필요한 항목에서 동문들이 출력에서 myprogram,다음과 같은 작동:

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top