次のように、各行の単語がコンマで区切られたテキスト ファイルがあります。
7022122465,0,\N,,0,2015-09-29 10:48:33
7022597642,0,\N,,0,2015-09-29 10:48:33
7022848906,0,\N,,0,2015-09-29 10:48:33
7022848906,5,\N,,0,2015-09-29 10:48:33
7022848906,55,\N,,0,2015-09-29 10:48:33
.....................................etc
Linux/UNIX でsed
orコマンドのみを使用して、2 番目の列のゼロ以外の数をカウントしたいと思います。grep
注記
他のコマンドを使用せずに:
cut -d',' -f2 < KAR_UBONA_UBONACT15_20150929_20150930_FEEDBACK.txt | grep -vcw 0
しかし、私は だけを望んでいるのではなくcut
、 を使用する必要がありますgrep
。
答え1
grep のオプションを使用できます-c
。次のようにして、最初のカンマまでのすべての文字と、2 番目のカンマ以降のすべてを削除できますsed
。
sed 's/^[^,]*,//;s/,.*//' < the_file | grep -c -E '[^0]'
編集: このsed
コマンドはあなたのコマンドと同じことを実行するcut
ので、元のコマンドも使用できるはずですgrep
。
編集2: 1つのコマンドだけを使いたい場合は、@cuonglm grp answerを使用できます。1回の呼び出しsed
最後に行数を合計するために、ラベルを使った作業が大量に必要になります。
sed -E -n '
s/^[^,]*,[^0,]+,.*/+1/ # replace the lines we are interested in with "+1"
T delete_line # if we did not do a substitution right now we jump to "delete_line"
H # we did not jump (so we did the substitution and append the "+1" to the hold space
: delete_line # the label, here we do nothing (silently drop the current line)
$ { # on the last line we ...
s/.*/0/ # replace the whole line with "0"
G # append the hold space (all the "+1" from before")
s/\n//g # remove all newlines
p # print the line
}' < the_file
これを にパイプするbc
か、p
コマンドを複雑なsed
マジックで置き換えて でこれらの数値を合計することができますsed
。 はチューリング完全であると聞いたのでsed
、それは可能であるはずです。
使用したいだけの場合1つのプログラム(sed
)しかし、それを何度も呼び出すのは面倒ではありません。これははるかに簡単です。
sed '/^[^,]*,0,.*/d' < the_file | sed -n '$='
答え2
とgrep
:
grep -c '^[^,]*,[^0]' <file
これは2列目が整数の場合にのみ機能しますが、 の場合は機能しません-0
。+0
より一般的なケースについては、@Stéphane Chazelas の回答。
答え3
grep -c '^[^,]*,[-+0-9.]*[1-9]'
12
これにより、、、、、-1
と表現される数値がカバーされます。ただし、または、たとえば、はカバーされないため0e+12
、より標準的なものとは依然として異なります。01
0.0001
0xFF
Inf
NaN
POSIXLY_CORRECT=1 awk -v n=0 -F , '$2 != 0 {n++}; END{print n}'
入力にこのような形式で表現された数値が含まれている場合。
唯一の解決策としてはsed
、次の操作を実行できます。
sed '/^[^,]*,[-+0-9]*[1-9]/!d' | sed -n '$='
しかし、1 回の呼び出しのみのソリューションの場合はsed
、手作業で計算を行う必要があります。
sed -n '
1{x;s/$/0,:0123456789,0/;x;}
/^[^,]*,[-+0-9]*[1-9]/ {
x;:1
s/^,/1/;s/\(.\),\(.*:.*\1\(,*.\)\)/\3\2/;t1
s/:/,:/
x
}
${x;s/,.*//p;}'