
탭으로 구분된 파일이 있습니다. 두 번째 열에서 "exonic" 항목을 추출하고 세 번째 열에서 "비동의 SNV" 항목을 추출하고 열 4,5,7에서 (<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