2012-04-12 20 views
4

有沒有一個內置的命令來做到這一點,或有人有任何運氣與腳本做到這一點?如何計算整個文件中字符串的出現次數?

我正在計算一個文件中出現某個字符串(而不是單詞)的次數。這可以包括每行多次出現的次數,因此計數應計入每次出現次數,而不是隻計算1次出現次數爲2次或更多次的行。

例如,使用此示例文件:

blah(*)wasp(*)jkdjs(*)kdfks(l*)ffks(dl 
flksj(*)gjkd(* 
)jfhk(*)fj (*) ks)(*gfjk(*) 

如果我期待數字符串(*)的出現我預計數爲6,即2從第一線,1條從第二線和第三線的3。請注意跨越第2-3行的那個不算數,因爲有一個LF字符將它們分開。

更新:到目前爲止的回覆非常棒!我可以要求腳本處理(*)\(*\)等的轉換嗎?這樣我就可以傳遞任何需要的字符串作爲輸入參數,而不用擔心需要對其進行什麼樣的轉換,以便以正確的格式顯示。

+0

我不太明白你的「更新」。你正在尋找正則表達式中Perl的'quotemeta'函數,或'\ Q'和'\ E'嗎? – DavidO 2012-04-12 08:38:45

+0

@DavidO - 我不確定quotemeta是否可以做到這一點。基本上我設想:var_input =「(*)」; var_proper_format = some_func(var_input);而/ var_proper_format/g; ....即如此var_proper_format自動計算從給定的輸入var_input – toop 2012-04-12 09:31:50

回答

6

-n開關的末尾使用perl的「愛斯基摩吻」操作符打印總數。使用\Q...\E忽略任何元字符。

perl -lnwe '$a+=()=/\Q(*)/g; }{ print $a;' file.txt 

腳本:

use strict; 
use warnings; 

my $count; 
my $text = shift; 

while (<>) { 
    $count +=() = /\Q$text/g; 
} 

print "$count\n"; 

用法:

perl script.pl "(*)" file.txt 
+0

這將如何製作成接受參數的腳本? – toop 2012-04-12 10:43:49

+1

@toop查看我的編輯 – TLP 2012-04-12 11:04:07

+0

我不得不grep + wc不能很好地工作,但是這個解決方案運行得很快,並且運行得很好!去Perl吧! – Excalibur 2013-08-01 21:08:45

2

這將循環遍歷文件的各行,並在每行上查找所有出現的字符串「(*)」。每次找到該字符串時,$ c都會遞增。當沒有更多行循環時,將打印$ c的值。

perl -ne'$c++ while /\(\*\)/g;END{print"$c\n"}' filename.txt

更新:關於你的評論,要求,這被轉換成接受一個正則表達式作爲參數的解決方案,你可以做這樣的:

perl -ne'BEGIN{$re=shift;}$c++ while /\Q$re/g;END{print"$c\n"}' 'regex' filename.txt

這應該去做把戲。如果我覺得再傾向於再次瀏覽perlrun,我可能會看到更優雅的解決方案,但這應該起作用。

你也可以消除明確的內部while循環贊成隱含一個提供列表環境的正則表達式:

perl -ne'BEGIN{$re=shift}$c+=()=/\Q$re/g;END{print"$c\n"}' 'regex' filename.txt

+0

這將如何被製成一個接受參數的腳本? – toop 2012-04-12 10:13:03

+0

@toop查看我的更新以獲取允許您在命令行中指定正則表達式的解決方案。 – DavidO 2012-04-13 03:42:27

21

您可以使用基本的工具,如grepwc

grep -o '(\*)' input.txt | wc -l 
+0

這將如何被製作成接受參數的腳本? – toop 2012-04-12 10:44:24

+0

+1甚至可驗證的'echo $'blah(*)wasp(*)jkdjs(*)kdfks(l *)ffks(dl \ nflksj(*)gjkd(* \ n)jfhk(*)fj(*) ks)(* gfjk(*)'| grep -o'(\ *)'| wc -l'。 – l0b0 2012-04-12 10:48:55

-1
text="(\*)" 
grep -o $text file | wc -l 

你可以把它變成它接受參數,像這樣的腳本:

腳本計數

#!/bin/bash 
text="$1" 
file="$2" 
grep -o "$text" "$file" | wc -l 

用法:

./count "(\*)" file_path 
+0

......這就是大多數投票答案的一樣。你試圖重新發布所有bash的答案嗎? – 2015-04-27 11:53:24

+0

有人想把這個劇本寫出來,我正在編寫這個 – Jahid 2015-04-27 12:05:46

+0

評論或編輯答案通過添加你的貢獻...文件一個新的答案只是噪音 – 2015-04-27 12:11:58

1

您可以使用基本的grep命令:

:如果你想找到沒有 「你好」 字出現的在一個文件

grep -c "hello" filename 

如果你想找到任何一種模式的出現則

grep -c -P "Your Pattern" 

圖案舉例:hell.w,\ d +

0

我用以下命令來查找特定的字符串計數文件

grep search_String fileName | wc -l

+1

問題要求perl解決方案,而Arjit的anser已經給出了用grep -c解決這個問題的「完美」方法。從這個意義上說:你的回答並沒有真正添加任何有用的東西。 – GhostCat 2017-01-12 07:17:03

相關問題