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}'代わりに を使用すると、出力に正しい行が表示されるはずです。

,0のような文字列にも一致しますが213,0123、これをゼロ区切り文字として扱うかどうかは任意です。

したがって、,フィールド区切り文字として使用し、ゼロが 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

いくつかの仮定があります:

  • ゼロ以外の数字はゼロで始まりません。
  • ゼロの数字にはゼロが1つだけ含まれます。
  • すべての数字は整数です。

必要に応じて、正規表現を拡張してこのようなケースに対処することもできます。

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

すべての数が整数の場合、GNU awk単語境界をサポートしているので\<...\>、次のようにすることができます

gawk 'gsub(/\<0\>/, "0") <5' infile

関連情報