열에서 처음 5개의 가장 높은 숫자를 인쇄하는 방법은 무엇입니까?

열에서 처음 5개의 가장 높은 숫자를 인쇄하는 방법은 무엇입니까?

4개의 열이 있는 텍스트 파일이 있습니다. 파일 끝까지 읽어서 열 3(처음 5개 값)과 열 1에 가장 높은 숫자를 인쇄해야 합니다.

입력.txt

xm|340034177|ref|RT_235820.1|   139697  192 0
xm|161622288|ref|RT_340093.1|   153819  2607    0
xm|75755638|ref|RT_557407.1|    153821  1937    0
xm|108773031|ref|RT_678101.1|   161452  1688    0
xm|30352011|ref|RT_784766.1|    150568  105 0

출력.txt

xm|161622288|ref|RT_340093.1|   2607
xm|75755638|ref|RT_557407.1|    1937
xm|108773031|ref|RT_678101.1|   1688
xm|340034177|ref|RT_235820.1|   192
xm|30352011|ref|RT_784766.1|    105

답변1

sort -k3n,3 filename | tail -5 | cut -d " " -f1,6-7

위 명령은 세 번째 필드의 파일을 정렬합니다. 이제 이 출력을 tail세 번째 열의 처음 5개 숫자를 인쇄하는 명령으로 파이프합니다. 그러나 출력에 첫 번째와 세 번째 열만 필요한 경우 출력을 cut명령으로 파이프할 수 있습니다.

시험

cat filename

T_235820.1|   139697  192 0
xm|161622288|ref|RT_340093.1|   153819  2607    0
xm|75755638|ref|RT_557407.1|    153821  1937    0
xm|108773031|ref|RT_678101.1|   161452  1688    0
xm|30352011|ref|RT_784766.1|    150568  105 0
T_235820.1|   139697  192 0
xm|161622288|ref|RT_340093.1|   153819  607    0
xm|75755638|ref|RT_557407.1|    153821  937    0
xm|108773031|ref|RT_678101.1|   161452  1881    0
xm|30352011|ref|RT_784766.1|    150568  1051 0

이제 이 파일에 대해 위 명령을 실행합니다.

sort -k3n,3 filename | tail -5 | cut -d " " -f1,6-7

내가 얻는 결과는 다음과 같습니다.

xm|30352011|ref|RT_784766.1|  1051
xm|108773031|ref|RT_678101.1| 1688 
xm|108773031|ref|RT_678101.1| 1881 
xm|75755638|ref|RT_557407.1|  1937
xm|161622288|ref|RT_340093.1| 2607 

편집하다

파일에 부동 소수점과 음수가 있는 경우 -g 플래그를 추가할 수도 있습니다. 명령은 다음과 같습니다.

sort -k3ng,3 filename | tail -5 | cut -d " " -f1,6-7

답변2

파일을 처리하기 전에 정렬할 수 있습니다 awk.

$ sort -rnk3 file | awk 'FNR < 6 {print $1,$3}' OFS="\t"
xm|161622288|ref|RT_340093.1|   2607
xm|75755638|ref|RT_557407.1|    1937
xm|108773031|ref|RT_678101.1|   1688
xm|340034177|ref|RT_235820.1|   192
xm|30352011|ref|RT_784766.1|    105

또는 perl단독으로 작업을 수행할 수도 있습니다.

$ perl -anle '
    push @a, [$F[0],$F[2]];
    END {
        $" = "\t";
        print "@$_" for (sort { $b->[1] <=> $a->[1] } @a)[0..4];
    }
' file
xm|161622288|ref|RT_340093.1|   2607
xm|75755638|ref|RT_557407.1|    1937
xm|108773031|ref|RT_678101.1|   1688
xm|340034177|ref|RT_235820.1|   192
xm|30352011|ref|RT_784766.1|    105

관련 정보