2016-04-19 66 views
-2

我正在嘗試編寫一個非常小的程序來檢查大型文本文件中子字符串的數量。它所要做的就是計算文本文件的前2000行,找到任何「TTT」子字符串,對它們進行計數,然後爲該總數設置一個變量。我對shell有點新,所以任何幫助都會令人驚歎!查找文件中的字符串數

#!/bin/bash 

$counter=(head -2000 [file name] | grep TTT | grep -o TTT | wc -l) 
echo $counter 
+2

它不工作?你實際上沒有提出問題。 –

+0

它給出了語法錯誤,對不起,如果不清楚 – Frost

+0

你必須使用'counter ='而不是'$ counter ='。順便說一下,第一個'grep TTT'可以跳過。 –

回答

0

對於什麼是值得你可能awk更適合這項任務:

awk -F"ttt" '{j=(NF-1)+j}END{print j}' filename 

這會在你的文件分隔符由「TTT」分裂每個記錄。然後它計算字段的數量,減去一個,並將其添加到總數中。

像一個文件:

ttt tttttt something 
1 5 ttt 
tt 
one more ttt record 

會被分割(與管DELIM可視化),如:

| || something 
1 5 | 
tt 
one more | record 

計數每個記錄中的字段數:

4 
2 
1 
2 

減去一個從那:

3 
1 
0 
1 

總計爲5,這是多少「ttt」子字符串存在。

將這一到您的腳本(和修復您的其他問題):

#!/bin/bash 

counter=$(awk -F"ttt" '{j=(NF-1)+j}END{print j}' filename) 
echo $counter 

的改變這裏的是,當我們在Bash中設置一個變量不包括在前面的$符號。只有在引用變量時,我們才包含$

+1

如何進一步? 'awk -v RS =「ttt」'END {print NR-1}'文件' – karakfa

+0

非常好! – JNevill

0

你有一些小的語法錯誤在那裏,也許你的意思是這樣的:

counter=$(head -2000 [file name] | grep TTT | grep -o TTT | wc -l) 
echo $counter 

通知我做的有微小的變化,使其工作。

者均基於grep TTT中間是多餘的,你可以簡單地放棄它,那就是:

counter=$(head -2000 [file name] | grep -o TTT | wc -l) 
0

的grep已經可以做你想做的:counter=$(grep -c TTT $infile)。你可以用-m NUM, --max-count=NUM來限制命中數(不是行數),這會使grep停在文件末尾,或者當發現NUM事件。