해결할 수 없을 것 같은 문제가 있습니다.
다음과 유사한 탭으로 구분된 거대한 텍스트 파일이 있습니다.
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)