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