Conte números diferentes de zero para cada linha de uma segunda coluna em um arquivo de texto

0

Eu tenho um arquivo de texto em que cada linha de palavras é separada por vírgulas, assim:

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

Eu quero contar números não-zero da segunda coluna usando apenas o comando sed ou grep no Linux / UNIX.

Nota

Sem usar outros comandos:

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

Mas não quero apenas cut , preciso usar grep .

    
por Narasimha Rao 19.05.2016 / 11:27

3 respostas

1

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 '$='
    
por 19.05.2016 / 11:36
1

com grep :

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

Isso só funciona se a segunda coluna for formada como um número inteiro, mas não -0 , +0 . Para casos mais gerais, veja a resposta do Stéphane Chazelas .

    
por 19.05.2016 / 11:37
1
grep -c '^[^,]*,[-+0-9.]*[1-9]'

Isso deve abranger os números expressos em 12 , -1 , 0e+12 , 01 , 0.0001 . Mas não para 0xFF ou Inf ou NaN , por exemplo, então isso ainda seria diferente do mais canônico:

POSIXLY_CORRECT=1 awk -v n=0 -F , '$2 != 0 {n++}; END{print n}'

Se a sua entrada tiver números expressos em tal formato.

Para uma solução de sed , você poderia:

sed '/^[^,]*,[-+0-9]*[1-9]/!d' | sed -n '$='

Mas, para uma solução com apenas uma invocação de sed , precisaríamos fazer a aritmética manualmente.

sed -n '
  1{x;s/$/0,:0123456789,0/;x;}
  /^[^,]*,[-+0-9]*[1-9]/ {
    x;:1
    s/^,/1/;s/\(.\),\(.*:.*\(,*.\)\)//;t1
    s/:/,:/
    x
  }
  ${x;s/,.*//p;}'
    
por 19.05.2016 / 11:44