如何使用 grep 計算字串出現的次數?
輸入:
.
├── a.txt
├── b.txt
// a.txt
aaa
// b.txt
aaa
bbb
ccc
現在我想知道有多少次aaa,并bbb出現。
輸出:
aaa: 2
bbb: 1
uj5u.com熱心網友回復:
你可以試試awk。這用于split計算搜索模式的出現次數并將它們放入“關聯”陣列中n。
$ awk 'BEGIN{ pat1="aaa"; pat2="bbb" }
{ n[pat1] =(split($0,arr,pat1)-1) }
{ n[pat2] =(split($0,arr,pat2)-1) }
END{ for(i in n){ print i":",n[i] } }' a.txt b.txt
aaa: 10
bbb: 14
示例資料
$ cat a.txt
aaa
aaa efwepom dq
bbb qwpdo bbb
qwdo qwdpomaaa
qwo bbb
pefaaaomaaaewe bb aa
aaa bbb
$ cat b.txt
aaa
aaa efwepom dq
bbb qwpdo bbb
qwdo qwdpomaaa
qwo bbb
pebbb bbb fobbbmebbbwe bb aa
aaa bbb
bbbbbbsad
uj5u.com熱心網友回復:
只是一個想法:
grep -E "aaa|bbb|ccc" *.txt | awk -F: '{print $2}' | sort | uniq -c
這意味著:
grep -E "...|..." : extended grep, look for all entries
The result is given as:
a.txt:aaa
b.txt:aaa
b.txt:bbb
b.txt:ccc
awk -F: '{print $2}' : split the result in 2 columns,
based on the semicolon,
and only show the second column
sort | uniq -c : sort and count unique entries
uj5u.com熱心網友回復:
問題grep是如果您在一行中有多個專案。
grepcounts lines,所以你需要-o另一個實體grep或一個wc或一些這樣的。
$: cat lst
aaa
bbb
$: cat a.txt
aaa
$: cat b.txt # I added a second hit on the bbb line
aaa
bbb bbb
ccc
$: files=( [ab].txt )
$: time while read pattern; do
printf "%s: " "$pattern";
grep -o "$pattern" "${files[@]}" | wc -l;
done < lst
aaa: 2
bbb: 2
請注意,即使使用如此小的資料集,這也很慢。
real 0m1.119s
user 0m0.060s
sys 0m0.308s
這使您可以創建一個串列檔案,但每個模式讀取目標集中的每個檔案一次,并對每個檔案執行grepAND wc。Andre的awk解決方案會更干凈、更快,而且通常更好,特別是如果您將串列放在一個檔案中并對其進行決議,而不是作為一組文字進行決議。
$: time awk 'NR==FNR{ pats[$0]; next; }
{ for (p in pats) { n[p] =(split($0,arr,p)-1) } }
END{ for(p in n){ print p": ",n[p] } }' lst "${files[@]}"
aaa: 2
bbb: 2
快得多 - 對于更多的資料和檔案,可能會更快。
real 0m0.344s
user 0m0.015s
sys 0m0.092s
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/383722.html
下一篇:用星號顯示用戶登錄的次數
