我有一个文本文件,每行单词都用逗号分隔,如下所示:
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命令来计算第二列的非零数。grep
笔记
不使用其他命令:
cut -d',' -f2 < KAR_UBONA_UBONACT15_20150929_20150930_FEEDBACK.txt | grep -vcw 0
但我不仅仅想要cut
,我需要使用grep
.
答案1
您可以使用-c
grep 选项。您可以使用以下命令删除第一个逗号之前的所有字符以及第二个逗号之后的所有内容sed
:
sed 's/^[^,]*,//;s/,.*//' < the_file | grep -c -E '[^0]'
编辑:此sed
命令的作用与您的命令相同,cut
因此您也应该能够使用原始grep
命令。
EDIT2:如果您只想使用一个命令,您可以使用 @cuonglm grp 答案。如果您只想使用一次调用为了总结最后的行数,需要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
已经完成,所以它应该是可能的。
如果你只想使用一个程序( sed
) 但不介意多次调用它,这样会容易得多:
sed '/^[^,]*,0,.*/d' < the_file | sed -n '$='
答案2
答案3
grep -c '^[^,]*,[-+0-9.]*[1-9]'
这应该涵盖表示为12
, -1
, 0e+12
, 01
, 的数字0.0001
。但不是 for0xFF
或Inf
orNaN
例如,所以这仍然与更规范的不同:
POSIXLY_CORRECT=1 awk -v n=0 -F , '$2 != 0 {n++}; END{print n}'
如果您的输入有以这种格式表示的数字。
对于sed
唯一的解决方案,您可以这样做:
sed '/^[^,]*,[-+0-9]*[1-9]/!d' | sed -n '$='
但对于只有一次调用的解决方案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;}'