Como imprimir a contagem do padrão em cada linha?

Como imprimir a contagem do padrão em cada linha?

Preciso imprimir a contagem de uma string correspondente no final de cada linha.

Um exemplo de correspondência foo:

foo,bar,foo,foo
bar,foo,bar,bar
foo,foo,bar,bar

Resultado:

foo,bar,foo,foo,3
bar,foo,bar,bar,1
foo,foo,bar,bar,2

Eu verifiquei este link (Como contar o número de um caractere específico em cada linha?) mas sem sorte.

Responder1

Podemos usar awk com gsub para obter a contagem de ocorrências.

 awk '{print $0","gsub(/foo/,"")}' file

Saída:

foo,bar,foo,foo,3
bar,foo,bar,bar,1
foo,foo,bar,bar,2

Responder2

Talvez com uma mistura de bashegrep

$ while read -r line; do 
    echo -n "$line -> " 
    grep -o foo <<<"$line" | wc -l 
  done < /path/to/my-input-file

foo,bar,foo,foo -> 3
bar,foo,bar,bar -> 1
foo,foo,bar,bar -> 2

Responder3

Caso alguém também queira algo em Python. Especifique o nome do arquivo e a palavra mágica para contar.

#!/usr/bin/python3
# magic_word_count.py
# Takes a filename and magic word and prints the number of times the word
# appears on each line of the file.
#
# ./magic_word_count.py myfile.txt foo
#
import sys 
filename = sys.argv[1]
magic_word = sys.argv[2]

with open(filename, 'r') as f:
    for line in f.readlines():
        words = line.strip().split(',')
        print(len([word for word in words if word == magic_word]))

Uso:

$ cat myfile.txt 
foo,bar,foo,foo
bar,foo,bar,bar
foo,foo,bar,bar

$ ./magic_word_count.py myfile.txt foo
3
1
2

Responder4

Usando awke assumindo que a entrada é CSV "simples" (sem vírgulas incorporadas ou novas linhas):

awk -v string="foo" -F, '
    BEGIN { OFS = FS }
    {
        sum = 0
        for (i = 1; i <= NF; ++i) sum += $i == string
        $(NF+1) = sum
    }; 1' file

Isso pega a string da qual queremos contar as ocorrências e, em seguida, itera pelos campos de cada registro, contando as correspondências exatas. A soma acumulada dos campos correspondentes é então adicionada como um novo campo no final do registro e o registro é impresso.

informação relacionada