'x'회 이상 0을 포함하는 행 삭제

'x'회 이상 0을 포함하는 행 삭제

큰 쉼표로 구분된 파일이 있습니다. 0이 포함된 x개의 열(첫 번째 행 제외)이 포함된 행을 필터링해야 합니다. 단순화를 위해 0이 4개 이상인 행을 필터링한다고 가정해 보겠습니다.

    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개가 ,03개로 간주됩니다.구분 기호, 4개 제공필드전체적으로. 따라서 대신 사용하면 awk -F',0' 'NF<5 {print}'출력에 올바른 줄이 표시됩니다.

,0213,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

KISS 접근 방식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

관련 정보