곱셈으로 표현된 두 번째 변수에서 최대값을 갖는 행을 추출

곱셈으로 표현된 두 번째 변수에서 최대값을 갖는 행을 추출

해결할 수 없을 것 같은 문제가 있습니다.

다음과 유사한 탭으로 구분된 거대한 텍스트 파일이 있습니다.

chr 10 20 20 a
chr 30 40 10 b
chr 30 40 15 b
chr 30 40 11 b

필요한 것은 다음과 같습니다. 1) 모든 고유 행 추출 2) 열 5가 여러 번 표시되는 경우(예: b) 열 4에 최대값이 있는 행.

따라서 위의 예에서 필요한 줄은 다음과 같습니다.

10월 20일 20일(이것은 고유한 행입니다)
30 40 15b(5열이 여러번 표현되는 경우 4열에서 값이 가장 큰 행이 됩니다.

이를 수행하는 쉬운 방법이 있습니까?

답변1

그러면 행을 다섯 번째 열로 그룹화하고 각 그룹에 대해 가장 큰 네 번째 열이 있는 행을 인쇄합니까?

음수가 없다고 가정하면 다음과 같습니다.

$ awk '$4 > val[$5] {val[$5] = $4; line[$5] = $0} 
       END {for (x in line) print line[x] }' < foo.txt
chr 10 20 20 a       
chr 30 40 15 b

답변2

예.txt

chr 10 20 20 a
chr 30 40 10 b
chr 30 40 15 b
chr 30 40 11 b

암호

 awk '$5== "a" {print $0}' l.txt | sort -k4 -nr | sed -n '1p' ; awk '$5=="b" {print $0}' l.txt | sort -k4  -nr | sed -n '1p'

산출

chr 10 20 20 a
chr 30 40 15 b

답변3

나는 다음과 같이 쓸 것이다:

awk '
    NR == FNR {count[$5]++; if ($4 > max[$5]) max[$5] = $4; next} 
    count[$5] > 1 && $4 == max[$5] && !seen[$0]++
' file file
chr 30 40 15 b

파일을 두 번 처리합니다.

  • 처음에는 5번째 필드의 발생 빈도를 계산하고 각 5번째 필드 값에 대해 가장 큰 4번째 필드를 찾습니다.
  • 두 번째로 다음 기준에 따라 작업하세요.
    • 5번째 필드의 발생만 여러 번 기록하고,
    • 가장 큰 네 번째 필드가 있는 레코드만 포함하며,
    • 유일무이한 기록

개수가 1인 행을 보려면 간단히 다음과 같이 작성할 수 있습니다.

awk 'NR == FNR {if ($4 > max[$5]) max[$5]=$4; next} $4==max[$5] && !seen[$0]++' file file
chr 10 20 20 a
chr 30 40 15 b

답변4

이 스니펫:

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
pl " Input data file $FILE:"
head $FILE

pl " Expected output:"
cat $E

pl " Results:"
datamash -t" " --group=5 max 4 --full <$FILE |
cut -d" " -f1-5

생산하다:

-----
 Input data file data1:
chr 10 20 20 a
chr 30 40 10 b
chr 30 40 15 b
chr 30 40 11 b

-----
 Expected output:
chr 10 20 20 a       
chr 30 40 15 b

-----
 Results:
chr 10 20 20 a
chr 30 40 15 b

이러한 시스템의 경우:

OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution        : Debian 8.9 (jessie) 
bash GNU bash 4.3.30
datamash (GNU datamash) 1.2
cut (GNU coreutils) 8.23

datamash에 대한 일부 세부 정보:

datamash        command-line calculations (man)
Path    : /usr/local/bin/datamash
Version : 1.2
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
Help    : probably available with -h,--help
Home    : https://savannah.gnu.org/projects/datamash/ (pm)
Home    : http://www.gnu.org/software/datamash (doc)

관련 정보