2016-04-19 67 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事件。