计算文本文件中第二列的每一行的非零数字

计算文本文件中第二列的每一行的非零数字

我有一个文本文件,每行单词都用逗号分隔,如下所示:

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 中仅使用sedor命令来计算第二列的非零数。grep

笔记

不使用其他命令:

cut -d',' -f2 < KAR_UBONA_UBONACT15_20150929_20150930_FEEDBACK.txt | grep -vcw 0

但我不仅仅想要cut,我需要使用grep.

答案1

您可以使用-cgrep 选项。您可以使用以下命令删除第一个逗号之前的所有字符以及第二个逗号之后的所有内容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

grep

grep -c '^[^,]*,[^0]' <file

仅当第二列的形式类似于整数时才有效,但不是-0+0。对于更一般的情况,请参阅@Stéphane Chazelas 的回答

答案3

grep -c '^[^,]*,[-+0-9.]*[1-9]'

这应该涵盖表示为12, -1, 0e+12, 01, 的数字0.0001。但不是 for0xFFInforNaN例如,所以这仍然与更规范的不同:

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;}'

相关内容