쉼표로 구분된 큰 파일이 있습니다. 0이 포함된 x개의 열(첫 번째 행 제외)이 포함된 행을 필터링해야 합니다. 단순화를 위해 4개 이상의 0이 포함된 행을 필터링한다고 가정해 보겠습니다.
gene,v1,v2,v3,v4,v5,v6,v7
gene1,0,1,5,0,0,4,100
gene2,1,0,0,0,5,210,2
gene3,0,0,0,0,6,0,0
다음을 반환합니다:
gene,v1,v2,v3,v4,v5,v6,v7
gene1,0,1,5,0,0,4,100
gene2,1,0,0,0,5,210,2
"gene3"을 필터링합니다.
내가 시도한 내용은 다음과 같습니다(',0'을 구분 기호로 사용하려고 시도했지만 실패함).
awk -F',0' 'NF<4 {print}' file.csv
답변1
, awk -F',0'
의 3개 사본은 ,0
3개 사본으로 처리됩니다.구분 기호, 4개 제공필드총. 따라서 이것을 사용하면 awk -F',0' 'NF<5 {print}'
출력에 올바른 줄이 표시됩니다.
,0
213,0123
0 구분 기호로 사용하거나 사용하지 않을 수 있는 와 같은 문자열과도 일치합니다 .
따라서 필드 구분 기호로 사용할 수도 ,
있고 0이 하나만 포함된 필드 개수를 계산할 수도 있습니다.
awk -F, '{z=0; for (i = 1 ; i <= NF ; i++) if ($i == 0) z++} z <= 4' file.csv
답변2
정규식과 를 사용할 수도 있습니다 grep
.
grep -Ev '(,0(,[^0,]+)*){4,}' file.csv
이 파일에서 테스트했습니다.
gene,v1,v2,v3,v4,v5,v6,v7
gene1,0,1,5,0,0,4,100
gene2,1,0,0,0,5,210,2
gene3,0,0,0,0,6,0,0
gene4,0,0,0,4,6,0,0
gene5,0,1,0,4,6,0,0
몇 가지 가정이 있습니다:
- 0으로 시작하는 0이 아닌 숫자는 없습니다.
- 0 숫자에는 0이 하나만 포함됩니다.
- 모든 숫자는 정수입니다.
필요한 경우 정규식을 확장하여 이와 같은 상황을 처리할 수 있습니다.
답변3
키스 방식awk
awk -F, '{c = 0; for(i=1; i<=NF; i++) {c += $i == "0" ? 1 : 0}} c <= 3' file.csv
gene,v1,v2,v3,v4,v5,v6,v7
gene1,0,1,5,0,0,4,100
gene2,1,0,0,0,5,210,2
그리고perl
perl -F, -ne 'print unless (grep { $_ eq "0" } @F) > 3' file.csv
gene,v1,v2,v3,v4,v5,v6,v7
gene1,0,1,5,0,0,4,100
gene2,1,0,0,0,5,210,2
답변4
모든 숫자가 정수인 경우 다음을 사용하십시오.암소 비슷한 일종의 영양 awk
단어 경계를 지원합니다 \<...\>
. 할 수 있습니다.
gawk 'gsub(/\<0\>/, "0") <5' infile