고유 ID 열에서 가장 일치하는 항목 유지

고유 ID 열에서 가장 일치하는 항목 유지

많은 열이 포함된 탭으로 구분된 파일이 있습니다.

1   A   10  1.94E-31       N/A   N/A    bat
1   B   20  1.94E-31       N/A   N/A    bear
1   C   12  1.94E-31       N/A   N/A    dear
1   D   36  1.94E-31       N/A   N/A    quinoa
1   R   55  1.94E-31       N/A   N/A    quinoa
2   E   48  1.94E-31       N/A   N/A    cat
2   F   62  1.94E-31       N/A   N/A    cat
2   G   49  1.94E-31       N/A   N/A    dog
2   H   13  1.94E-31       N/A   N/A    whale
3   I   28  1.94E-31       N/A   N/A    snake
3   J   95  1.94E-31       N/A   N/A    lion
3   K   64  1.94E-31       N/A   N/A    elephant
3   L   38  1.94E-31       N/A   N/A    dog
3   M   19  1.94E-31       N/A   N/A    fox
3   N   97  1.94E-31       N/A   N/A    eagle
3   O   84  1.94E-31       N/A   N/A    parrot
3   P   64  1.94E-31       N/A   N/A    insect
3   Q   13  1.94E-31       N/A   N/A    shark
3   R   49  1.94E-31       N/A   N/A    rat

열 3에 고유 ID 수가 가장 많은 행을 유지하고 싶습니다.

1   R   55  1.94E-31       N/A   N/A    quinoa
2   F   62  1.94E-31       N/A   N/A    cat
3   N   97  1.94E-31       N/A   N/A    eagle

내 실제 파일에는 헤더가 있고 열 3에는 소수점이 포함된 숫자가 포함되어 있습니다.

답변1

$ awk -F'\t' 'NR==1 {print ; next};
              $3 > largest[$1] { largest[$1]=$3; line[$1] = $0 };
              END { for (id in largest) { print line[id] }}' input.txt 
1       R       55      1.94E-31        N/A     N/A     quinoa
2       F       62      1.94E-31        N/A     N/A     cat
3       N       97      1.94E-31        N/A     N/A     eagle

이 awk 스크립트는 두 개의 배열을 사용합니다. 하나는 각 ID($1)에 대해 최대값인 $3를 추적하는 데 사용되고, 다른 하나는 관련 입력 행을 기록하는 데 사용됩니다.

모든 입력을 읽고 처리한 후 id 순서대로 라인을 인쇄합니다.

NR==1 {print; next};줄은 첫 번째 줄(헤더 줄)을 그대로 인쇄한 후 다음 입력 줄로 점프합니다.

관련 정보