awk를 사용하여 특정 열에서 0보다 작은 값과 점을 추출하고 행 전체를 인쇄하는 방법

awk를 사용하여 특정 열에서 0보다 작은 값과 점을 추출하고 행 전체를 인쇄하는 방법

탭으로 구분된 파일이 있고 두 번째 열에서 "exonic" 항목을 추출하고, 세 번째 열에서 "동의어가 아닌 SNV" 항목을 추출하고, 미만(< 1) 및 포인트 값(.)을 추출하려고 합니다.

Chr     Func.refGene    ExonicFunc.refGene  1000g2015aug_eas 1000g2015a avsnp147    ExAC_ALL
chr1    intergenic      synonymous SNV      .                .          .           .
chr1    exonic          nonsynonymous SNV   1.2              .          .           .
chr2    exonic          nonsynonymous SNV   0.246            .          rs2022      0.4061
chr2    intronic        synonymous SNV      .                0.7386     rs2289093   0.7275
chr2    exonic          nonsynonymous SNV   0.6131           0.7376     rs227       0.7167
chr2    intergenic      nonsynonymous SNV   .                0.231      .           .
chr3    exonic          synonymous SNV      0.2192           0.2376     rs230       0.2205
chr3    intergenic      nonsynonymous SNV   2.01             0.2376     rs230       0.2204

예상 출력

chr2    exonic  nonsynonymous SNV   0.246   .       rs2289195   0.4061
chr2    exonic  nonsynonymous SNV   0.6131  0.7376  rs2276599   0.7167

아래는 내가 작성한 코드입니다. awk -F'\t' '$2~/exonic/ && $3~/nonsynonymous SNV/ && $4~/^0/ && $5~/^0/ && $7~/^0/{print $0}' inputfile.txt >> outputfile.txt이는 4,5, 7열에서 0(1 미만)으로 시작하는 항목을 추출하지만 1 미만과 포인트(.)를 추출하는 방법을 모르겠습니다.

답변1

정규식 테스트를 사용하는 대신 문자열에 대해서는 문자열 비교를, 숫자에 대해서는 숫자 비교를 수행하는 것이 좋습니다.

$2 == "exonic"

그리고

$4+0 < 1

( +0어휘 비교 대신 숫자 비교를 강제합니다). 그 외에는 논리적으로 올바른지의 문제입니다.

$ awk -F'\t' '$2 == "exonic" && $3 == "nonsynonymous SNV" && ($4+0 < 1 || $4 == ".") && ($5+0 < 1 || $5 == ".") && ($7+0 < 1 || $7 == ".")' inputfile.txt
chr2    exonic  nonsynonymous SNV   0.246   .   rs2022  0.4061
chr2    exonic  nonsynonymous SNV   0.6131  0.7376  rs227   0.7167

관련 정보