
我需要在每行末尾打印匹配字串的計數。
匹配範例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
這獲取我們想要計算出現次數的字串,然後迭代每個記錄的字段,計算精確匹配。然後將匹配字段的累積和作為新字段添加到記錄的末尾,並列印該記錄。