如何打印每行的图案数?

如何打印每行的图案数?

我需要在每行末尾打印匹配字符串的计数。

匹配示例foo

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

结果 :

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

我已经检查过这个链接(如何统计每一行中特定字符的个数?)但没有运气。

答案1

我们可以使用 awk 和 gsub 来获取出现次数。

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

输出:

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

答案2

bash也许与和的混合grep

$ 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

答案3

如果有人也想要 Python 中的东西。指定文件名和要计数的魔术词。

#!/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]))

用法:

$ 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

答案4

使用awk并假设输入是“简单”CSV(没有嵌入逗号或换行符):

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

这获取我们想要计算出现次数的字符串,然后迭代每个记录的字段,计算精确匹配。然后将匹配字段的累积和作为新字段添加到记录的末尾,并打印该记录。

相关内容