発生回数を計算し、一致する値を持つ行を削除します。

発生回数を計算し、一致する値を持つ行を削除します。

私の問題を解決するのに役立ちますか?次のファイルがあります(カンマ区切り)。

A,250,13,820,0,80,201  
B,0,0,0,0,3,0  
C,0,2,1,0,0,0  
D,0,1,105,0,0,10  

5つの実際のゼロ値を持つ行(この場合は行B)を削除したいと思います。最終ファイルは次のようにする必要があります。

A,250,13,820,0,80,201  
C,0,2,1,0,0,0  
D,0,1,105,0,0,10

すべてのゼロが常に考慮されるため、コードを書くのに問題がありますawk(各行には5つのゼロ値がありますが、行Bには5つの実際のゼロがあります)。スクリプトがあれば簡単になりますかperl

答え1

Perlが救出に来る!

perl -aF, -ne 'print unless 5 == grep /^0$/, @F;' < input > output
  • -n入力を1行ずつ読みます。
  • -a各行を @F 配列に分割する
  • -F分割方法の指定(この場合はカンマ)
  • grepヒット数を返すためにスカラーコンテキストで使用されます。

答え2

awkを使う

awk -F, '{z=0; for (i=2; i<=NF; i++) if ($i == 0) z++} z != 5' file > newfile

答え3

0ファイルにitで始まる他の数字がなく、0最初のフィールドが例の数字ではない場合は、次のことができます。

sed -ne 's/,0//5;t' -e p < input > output

次の項目は削除されます。少なくとも5つの0。

サンプルを再利用して、次の操作を行います。

grep ',.*[1-9].*,.*[1-9]'

同じことを行います(最初のフィールドの後にゼロ以外の2つのフィールドを検索します)。

答え4

awk 'gsub(/,0/, ",0", $0) != 5' data.input

関連情報