0が「x」回以上含まれる行を削除する

0が「x」回以上含まれる行を削除する

カンマ区切りの大きなファイルがあります。ゼロを含むx列(最初の行を除く)を含む行をフィルタリングする必要があります。簡単にするために、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,01230区切り文字として使用したり使用したりしないなどの文字列とも一致します。

したがって、フィールド区切り文字として使用することも、ゼロ,を1つだけ含むフィールドの数を計算することもできます。

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 が 1 つだけ含まれます。
  • すべての数字は整数です。

必要に応じて正規表現を拡張して、このような状況を処理できます。

答え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

関連情報