제약 조건이 있는 중복 행 계산

제약 조건이 있는 중복 행 계산

다음 파일이 있습니다.

A B 1990
A C 2001
A C 2013
A B 2001
B C 2013
A D 2001
A D 2014

첫 번째 열과 두 번째 열의 중복 쌍을 계산하고 각 쌍에 세 번째 열의 가장 낮은 값을 할당해야 합니다. 내 장난감 파일의 경우 출력은 다음과 같아야 합니다.

A B 2 1990
A C 2 2001
A D 2 2001
B C 1 2013

예를 들어 pair는 A B두 번 나타납니다. 처음에는 값이 1990이고 두 번째에는 값이 2001입니다. 1990 < 2001이므로 해당 개수에 1990을 할당합니다.

Linux 도구(Bash, AWK, Perl)를 사용하여 이를 수행하는 방법을 알고 싶습니다. 어떤 아이디어나 조언이라도 주시면 감사하겠습니다.

답변1

이 시도:

$ awk -v SUBSEP=" " '
    {a[$1,$2]++;b[$1,$2] = (b[$1,$2] && $3 > b[$1,$2]) ? b[$1,$2] : $3}
    END {
        for (i in a) {
            print i,a[i],b[i];
        }
    }
' file
A B 2 1990
A C 2 2001
A D 2 2001
B C 1 2013

필드 순서를 변경할 수 있으면 훨씬 더 짧아집니다.

$ sort -n -k1 -k2 -k3 file | uniq -c -w 3
      2 A B 1990
      2 A C 2001
      2 A D 2001
      1 B C 2013

관련 정보