연속적으로 번호가 매겨진 각 하위 그룹/군에 대해 텍스트 파일에서 주어진 열의 가장 높은 값을 포함하는 단일 행을 추출합니다.

연속적으로 번호가 매겨진 각 하위 그룹/군에 대해 텍스트 파일에서 주어진 열의 가장 높은 값을 포함하는 단일 행을 추출합니다.

내 텍스트 파일에서 열 2의 연속 번호가 지정된 각 가족(예: family_1, family_2 등)에서 열 3에 있는 가장 높은 값이 포함된 행을 가져와 이 데이터를 새 텍스트 파일에 입력하려고 합니다.

입력 데이터:

TTGSCA  family_1    18.123083   681 36349   1
TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
CTYAAG  family_2    16.95983    657 36170   1
.GCCAAR family_3    19.436863   698 35844   1
WGCCAA. family_3    19.99668    747 38506   1
.GCCAAS family_3    17.037859   599 31922   1
WGCCAA. family_3    19.99668    747 38506   1
CCACTK  family_4    17.200712   776 44550   1
CCACTY  family_4    18.86465    727 38616   1
MCACTT  family_4    18.0871 737 40399   1
MCACTT  family_4    18.0871 737 40399   1
YCACTT  family_4    19.369513   804 43376   -1
CCAYTT  family_4    16.193245   752 44296   1
CCAYTT  family_4    16.193245   752 44296   1
SCACTT  family_4    19.759317   687 34686   1

출력 데이터:

TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
WGCCAA. family_3    19.99668    747 38506   1
SCACTT  family_4    19.759317   687 34686   1

grep을 사용해야 할지 awk를 사용해야 할지, 그리고 이들을 하나의 기능으로 결합하는 방법을 잘 모르겠습니다.

답변1

그리고GNU 데이터 혼합(그리고 의 약간의 도움 cut):

$ datamash -Wf groupby 2 max 3 < file.txt | cut -f1-6
TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
WGCCAA. family_3    19.99668    747 38506   1
SCACTT  family_4    19.759317   687 34686   1

답변2

datamash나는 이것이 아마도 최고의 도구라고 생각 하지만 여기에 독특한 대안이 있습니다.

<infile sort -k2,2V -k3,3n | awk 'NR==1 || $2!=p; { p=$2 }'

답변3

이전 답변보다 원하는 출력을 얻는 더 깔끔한 방법이 있습니다. 두 번 사용해야 하지만 , 및 를 네 번 사용하는 것보다 훨씬 낫습니다 sort.sortgreptail

sort -k3r numbers | awk '!seen[$2]++' | sort -k2

산출:

TTGSCA  family_1    18.123083   681 36349   1
CTTRAG  family_2    17.844843   685 37001   1
WGCCAA. family_3    19.99668    747 38506   1
SCACTT  family_4    19.759317   687 34686   1

관련 정보