|
mygod |
发表于: 2002/01/29 11:13am
|
小弟有一计,不知可否: awk '/hello/{print $0}' test > test1 awk 'BEGIN{FS='\n';OFS=''}{print $0}' test1 > test2 sed 's/$/aaa/' test2 > test3 awk 'BEGIN{FS='hello';OFS='\n';}' test3 > test4 length=`cat test3 | wc -l` length=`length - 1`
|
| |
|
shirley |
发表于: 2002/01/29 11:38am
|
执行了一下,有语法错误。我再仔细看看。 看的出来,阁下的shell水平很高。 或许命令awk的使用是关键,这个我不很熟,需要恶补一下。 |
| |
|
mygod |
发表于: 2002/01/29 11:46am
|
| 可能是最后一句有错,我的意思是将length的值减去1,可能写法不对 |
| |
|
shirley |
发表于: 2002/01/29 11:57am
|
好象第一行执行就有错。可能是分隔符闹的吧。 最后一句确实不对,应该是: length=`expr $length - 1` |
| |
|
mygod |
发表于: 2002/01/29 12:31pm
|
/hello/和{print $0}之间应当有空格,程序的思路大体是这样: 首先,将文件中所有包含'hello'的行输出到test1中,然后将文件的所有行连成一行输出到test2,这样test2就变成了只有一行的文件,然后为了避免文件的最后一个单词是'hello'造成边界问题,在test2的最后加上'aaa',输出到test3,然后以'hello'为分割符,回车为输出的分割符将内容输出到test4,这样文件中有多少个'hello'就会有多少个回车,也就是有多少行,当然最后别忘了减一 |
| |
|
feeling |
发表于: 2002/01/29 02:23pm
|
[这个贴子最后由feeling在 2002/01/29 03:47pm 编辑]
赋值语句可以直接用 let length=$length-1
|
| |
|
shirley |
发表于: 2002/01/29 02:43pm
|
[quote][b]下面引用由[u]feeling[/u]在 [i]2002/01/29 02:23pm[/i] 发表的内容:[/b] 赋值语句可以直接用 $length=$length-1 或者 let length=$length-1 [/quote] 你这指的是什么shell呀。据我所知,B SHELL和K SHELL是不能这样写的。 |
| |
|
feeling |
发表于: 2002/01/29 03:43pm
|
[这个贴子最后由feeling在 2002/01/29 03:48pm 编辑]
写错了一点,已经修改。 在K Shell 下调试通过 |
| |
|
mygod |
发表于: 2002/01/29 05:08pm
|
| 请大家开动脑筋,看看还有没有其他方法 |
| |
|
梦叮咚 |
发表于: 2002/01/29 05:18pm
|
| 我刚学shell,不过觉得上例有些烦琐,用c shell会不会简单一些. 不是很懂,只是提个想法. |
| |
|
feeling |
发表于: 2002/01/29 06:09pm
|
| 如果只是想知道个数的话,可以简单地在vi模式用查找、替换命令来得到。 |
| |
|
cpss |
发表于: 2002/01/29 08:01pm
|
这样写行不行: number=`more test|tr 'hello'|wc -w` #计算以hello为界限拔test分为几部分 number=`expr $number - 1` #上面的办法会多计上一个,所以这里减掉一。 |
| |
|
mygod |
发表于: 2002/01/30 10:13am
|
[这个贴子最后由mygod在 2002/01/30 10:15am 编辑]
呵呵,偶又生一计: sed 's/hello/\nhello\n/' test > test1 sed '/hello/' test1 > test2 length=`cat test2 | wc -l`
|
| |
|
shirley |
发表于: 2002/01/30 11:01am
|
| mygod真是高手啊。我的想法与你不谋而合。就是将hello用一个包含特殊标志的新行代替,然后计算包含特殊标志的行数。只是不知道在sed中怎样添加一个新行,好象\n不成。 从今天早上坐车开始,我就在琢磨sed的使用。 |
| |
|
mygod |
发表于: 2002/01/30 11:35am
|
哈哈,I got it,在AIX上调试通过: sed 's/$/qqq/' test > test1 cat test1 | tr -d '\n' > test2 cat test2 | tr 'hello' '\n' > test3 length=`cat test3 | wc -l` length=`expr $length - 1`
|
| |
|
michaelds |
发表于: 2002/03/13 07:09pm
|
刚翻出这个旧帖,觉得可以这样: awk '{for (i=1;i<=NF;i++) if ($i == "hello") count++} END{print count}' file |
| |
|
mygod |
发表于: 2002/03/14 08:36am
|
| 哇,高明! |
| |
|
txlinux |
发表于: 2002/03/14 09:17am
|
佩服各位高手的SHELL功底! 小弟深受 |
| |
|
txlinux |
发表于: 2002/03/14 09:19am
|
。。。。 深受启发!(刚才一不小心,错按了发表。:)
|
| |
|
哈密瓜 |
发表于: 2002/03/14 09:26am
|
| michaelds 跟 mygod两位高手太扎实了,pfpf! |
| |
|
bjchenxu |
发表于: 2002/08/16 03:41pm
|
在valentine的启发下,我也提出一种解法 sed 's/hello/hello@/g' test | tr '@' '\n' | grep -c hello
|
| |
|
HopeCao |
发表于: 2002/08/17 09:52am
|
Num=0 awk '/hello/' test | while read Line do Num=`expr $Num + 1` done echo $Num 这样子不知道行不行? |
| |
|
bjchenxu |
发表于: 2002/08/19 04:51pm
|
[这个贴子最后由bjchenxu在 2002/08/19 06:12pm 编辑]
再来一招 编辑脚本文件sedfile 内容为: s/hello/&\ /g然后运行命令: sed -f sedfile test | grep -c hello 注意,以上在csh中通过 ------------------- bash中就更加简单了 不用建立什么文件了 sed 's/hello/&\ /g' test | grep -c hello |
| |
|
|