
내 텍스트 파일에서 열 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
.sort
grep
tail
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