0이 "x"회 이상 포함된 행 삭제

0이 "x"회 이상 포함된 행 삭제

쉼표로 구분된 큰 파일이 있습니다. 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개 사본은 ,03개 사본으로 처리됩니다.구분 기호, 4개 제공필드총. 따라서 이것을 사용하면 awk -F',0' 'NF<5 {print}'출력에 올바른 줄이 표시됩니다.

,0213,01230 구분 기호로 사용하거나 사용하지 않을 수 있는 와 같은 문자열과도 일치합니다 .

따라서 필드 구분 기호로 사용할 수도 ,있고 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

관련 정보