
Necesito imprimir el recuento de una cadena coincidente al final de cada línea.
Un ejemplo de coincidencia 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
He comprobado este enlace (¿Cómo contar el número de un carácter específico en cada línea?) pero no hubo suerte.
Respuesta1
Podemos usar awk con gsub para obtener el recuento de ocurrencias.
awk '{print $0","gsub(/foo/,"")}' file
Producción:
foo,bar,foo,foo,3
bar,foo,bar,bar,1
foo,foo,bar,bar,2
Respuesta2
Quizás con una mezcla de bash
ygrep
$ 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
Respuesta3
Por si alguien también quisiera algo en Python. Especifique el nombre del archivo y la palabra 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
Respuesta4
Usar awk
y asumir que la entrada es CSV "simple" (sin comas incrustadas ni nuevas líneas):
awk -v string="foo" -F, '
BEGIN { OFS = FS }
{
sum = 0
for (i = 1; i <= NF; ++i) sum += $i == string
$(NF+1) = sum
}; 1' file
Esto toma la cadena cuyas apariciones queremos contar y luego recorre en iteración los campos de cada registro, contando las coincidencias exactas. La suma acumulada de campos coincidentes se agrega como un nuevo campo al final del registro y se imprime el registro.