Você pode usar a opção -c
do grep. E você pode remover todos os chars até a primeira vírgula e tudo a partir da segunda vírgula com sed
:
sed 's/^[^,]*,//;s/,.*//' < the_file | grep -c -E '[^0]'
EDIT: Este comando sed
faz o mesmo que o seu comando cut
, então você também deve poder usar o comando grep
original.
EDIT2: Se você quiser usar apenas um comando, você pode usar @cuonglm grp answer. Se você quiser usar somente uma invocação de sed
, haverá muito trabalho com rótulos para somar a contagem de linhas no final.
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
Isso agora pode ser canalizado para bc
ou você pode substituir o comando p
por alguma% complicada desed
magic para somar esses números em sed
. Acredito que ouvi dizer que sed
está em andamento, por isso deve ser possível.
Se você quiser usar apenas um programa ( sed
), mas não se importar em invocá-lo várias vezes, é muito mais fácil:
sed '/^[^,]*,0,.*/d' < the_file | sed -n '$='