Chinaunix

标题: 这个shell script 怎么写? [打印本页]

作者: shirley    时间: 2002-01-29 10:55
标题: 这个shell script 怎么写?
想写这么一个shell script, 找出一个文件比如test中出现hello的次数。
请大家帮帮忙,我还没想出来。
作者: mygod    时间: 2002-01-29 11:13
标题: 这个shell script 怎么写?
小弟有一计,不知可否:
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:38
标题: 这个shell script 怎么写?
执行了一下,有语法错误。我再仔细看看。
看的出来,阁下的shell水平很高。
或许命令awk的使用是关键,这个我不很熟,需要恶补一下。
作者: mygod    时间: 2002-01-29 11:46
标题: 这个shell script 怎么写?
可能是最后一句有错,我的意思是将length的值减去1,可能写法不对
作者: shirley    时间: 2002-01-29 11:57
标题: 这个shell script 怎么写?
好象第一行执行就有错。可能是分隔符闹的吧。
最后一句确实不对,应该是:
length=`expr $length - 1`
作者: mygod    时间: 2002-01-29 12:31
标题: 这个shell script 怎么写?
/hello/和{print $0}之间应当有空格,程序的思路大体是这样:
首先,将文件中所有包含'hello'的行输出到test1中,然后将文件的所有行连成一行输出到test2,这样test2就变成了只有一行的文件,然后为了避免文件的最后一个单词是'hello'造成边界问题,在test2的最后加上'aaa',输出到test3,然后以'hello'为分割符,回车为输出的分割符将内容输出到test4,这样文件中有多少个'hello'就会有多少个回车,也就是有多少行,当然最后别忘了减一
作者: feeling    时间: 2002-01-29 14:23
标题: 这个shell script 怎么写?
[这个贴子最后由feeling在 2002/01/29 03:47pm 编辑]

赋值语句可以直接用 let length=$length-1

作者: shirley    时间: 2002-01-29 14:43
标题: 这个shell script 怎么写?
下面引用由feeling2002/01/29 02:23pm 发表的内容:
赋值语句可以直接用 $length=$length-1 或者 let length=$length-1
你这指的是什么shell呀。据我所知,B SHELL和K SHELL是不能这样写的。
作者: feeling    时间: 2002-01-29 15:43
标题: 这个shell script 怎么写?
[这个贴子最后由feeling在 2002/01/29 03:48pm 编辑]

写错了一点,已经修改。
在K Shell 下调试通过
作者: mygod    时间: 2002-01-29 17:08
标题: 这个shell script 怎么写?
请大家开动脑筋,看看还有没有其他方法
作者: 梦叮咚    时间: 2002-01-29 17:18
标题: 这个shell script 怎么写?
我刚学shell,不过觉得上例有些烦琐,用c shell会不会简单一些.

不是很懂,只是提个想法.
作者: feeling    时间: 2002-01-29 18:09
标题: 这个shell script 怎么写?
如果只是想知道个数的话,可以简单地在vi模式用查找、替换命令来得到。
作者: cpss    时间: 2002-01-29 20:01
标题: 这个shell script 怎么写?
这样写行不行:
number=`more test|tr 'hello'|wc -w`  #计算以hello为界限拔test分为几部分
number=`expr $number - 1`  #上面的办法会多计上一个,所以这里减掉一。
作者: mygod    时间: 2002-01-30 10:13
标题: 这个shell script 怎么写?
[这个贴子最后由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:01
标题: 这个shell script 怎么写?
mygod真是高手啊。我的想法与你不谋而合。就是将hello用一个包含特殊标志的新行代替,然后计算包含特殊标志的行数。只是不知道在sed中怎样添加一个新行,好象\n不成。

从今天早上坐车开始,我就在琢磨sed的使用。
作者: mygod    时间: 2002-01-30 11:35
标题: 这个shell script 怎么写?
哈哈,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 19:09
标题: 这个shell script 怎么写?
刚翻出这个旧帖,觉得可以这样:
awk '{for (i=1;i<=NF;i++) if ($i == &quot;hello&quot count++} END{print count}' file
作者: mygod    时间: 2002-03-14 08:36
标题: 这个shell script 怎么写?
哇,高明!
作者: txlinux    时间: 2002-03-14 09:17
标题: 这个shell script 怎么写?
佩服各位高手的SHELL功底!
小弟深受
作者: txlinux    时间: 2002-03-14 09:19
标题: 这个shell script 怎么写?
。。。。
深受启发!

(刚才一不小心,错按了发表。:)

作者: 哈密瓜    时间: 2002-03-14 09:26
标题: 这个shell script 怎么写?
michaelds 跟 mygod两位高手太扎实了,pfpf!
作者: bjchenxu    时间: 2002-08-16 15:41
标题: 这个shell script 怎么写?
在valentine的启发下,我也提出一种解法
sed 's/hello/hello@/g' test | tr '@' '\n' | grep -c hello

作者: HopeCao    时间: 2002-08-17 09:52
标题: 这个shell script 怎么写?
Num=0
awk '/hello/' test | while read Line
do
       Num=`expr $Num + 1`
done
echo $Num
这样子不知道行不行?
作者: bjchenxu    时间: 2002-08-19 16:51
标题: 这个shell script 怎么写?
[这个贴子最后由bjchenxu在 2002/08/19 06:12pm 编辑]

再来一招
编辑脚本文件sedfile
内容为:
s/hello/&amp;\
/g

然后运行命令:
sed -f sedfile test | grep -c hello

注意,以上在csh中通过

-------------------
bash中就更加简单了
不用建立什么文件了
sed 's/hello/&amp;\
/g' test | grep -c hello
作者: wangrujun    时间: 2003-03-27 19:03
标题: 这个shell script 怎么写?
这样为什么不行呢?不在文件里面,在命令行中
echo "/xxx/1/2/3/4/5.sh" | awk '{for (i=1;i<=NF;i++) if ($i == "/" count++} END{print count}'
作者: 红袖添香    时间: 2003-03-28 01:58
标题: 这个shell script 怎么写?
原帖由 "wangrujun" 发表:
这样为什么不行呢?不在文件里面,在命令行中
echo "/xxx/1/2/3/4/5.sh" | awk '{for (i=1;i<=NF;i++) if ($i == "/" count++} END{print count}'


我猜你是想数一下有几个"/",是吧?

当然这样是不行的,域分隔符默认是空白,而你这里不存在啊。加上空白就行了,你可以试一下,

# echo "/ xxx / 1 / 2 / 3 / 4 / 5.sh" | awk '{for (i=1;i<=NF;i++) if ($i == "/" count++} END{print count}'

这样加空格当然只是说明一下怎么回事,想要达到你的目的,可以这样做,

# echo "/xxx/1/2/3/4/5.sh" | nawk '{gsub(/[^\/]/,"",$0) ; print length($0) }'
作者: wangrujun    时间: 2003-03-28 09:09
标题: 这个shell script 怎么写?
您真厉害。nawk我还是第一次看到。shell的书上只介绍了awk

打心底佩服您的shell功力。

多谢您的指教。
作者: aquino    时间: 2003-03-28 10:25
标题: 这个shell script 怎么写?
不用编程啦,
grep -c hello test
作者: wangrujun    时间: 2003-03-28 11:57
标题: 这个shell script 怎么写?
原帖由 "aquino" 发表:
不用编程啦,
grep -c hello test


如果一行中有两个以上hello,这样就错了。
作者: tanny    时间: 2003-03-28 13:06
标题: 这个shell script 怎么写?
原帖由 "shirley" 发表:
mygod真是高手啊。我的想法与你不谋而合。就是将hello用一个包含特殊标志的新行代替,然后计算包含特殊标志的行数。只是不知道在sed中怎样添加一个新行,好象\n不成。

从今天早上坐车开始,我就在琢磨sed的使用。


\n就是\之后敲回车键
作者: carr    时间: 2003-04-17 13:22
标题: 这个shell script 怎么写?
大家可真是高啊!PFPF
作者: wstommy    时间: 2003-04-17 17:52
标题: 这个shell script 怎么写?
原帖由 "michaelds" 发表:
刚翻出这个旧帖,觉得可以这样:
awk '{for (i=1;i<=NF;i++) if ($i == "hello" count++} END{print count}' file


牛,PFPF
作者: woodie    时间: 2003-04-28 19:17
标题: 这个shell script 怎么写?
tr -d "\n" < test| perl -e '$_=<STDIN>;print s/hello//g'
作者: rollingpig    时间: 2003-06-24 17:19
标题: 这个shell script 怎么写?
cat test |awk '{OFS="\n";print $1}'|grep hello|wc -l
作者: minewhy    时间: 2003-06-25 13:53
标题: 这个shell script 怎么写?
前面的shell程序可能没有考虑到形如khellollsd这种夹在中间的hello词汇。容易造成错误。
      我写了一个perl的程序,望大家指正:
     #!/usr/bin/perl
      my ($count);
      $count=0;
     open(IN,"test";
     while(<IN>
         {  @words=split(/ /,$_);
            foreach $word (@words)
                 { if($word =~ /hello/i)  { $count++;}}
         }
         print "the hello number is $count\n";

   在solaries 下通过运行。
作者: lovesaka    时间: 2006-10-03 02:27

  1. xargs -n1 <file|grep "hello"|wc -w
复制代码

作者: awk就是awp加ak    时间: 2006-10-03 10:37
喝喝,把陈年老酒都挖出来了!
不用说,最后一个方法最精简
作者: 寂寞烈火    时间: 2006-10-03 11:58
原帖由 awk就是awp加ak 于 2006-10-3 10:37 发表
喝喝,把陈年老酒都挖出来了!
不用说,最后一个方法最精简

grep -o '\<hello\>' tets|wc -l
or
awk '{for(i=1;i<=NF;i++)if($i~/\<hello\>/){n++}}END{print n}' test
BTW:这贴忒old啦~
作者: awk就是awp加ak    时间: 2006-10-03 12:07
貌似不是统计包含 "hello" 得有多少行
作者: lei8c8    时间: 2006-10-04 22:45
原帖由 minewhy 于 2003-6-25 13:53 发表
前面的shell程序可能没有考虑到形如khellollsd这种夹在中间的hello词汇。容易造成错误。
      我写了一个perl的程序,望大家指正:
     #!/usr/bin/perl
      my ($count);
      $count=0;
     open(IN ...

hi,你这种情况似乎也有漏洞的
比如有一行: abc hellohello cba
就会少统计一次
作者: easthh    时间: 2006-10-07 11:25
换个思路。(K shell@AIX下通过)
for i in `awk -F "hello" '{print NF}' urfile`
do
let x=${x:-0}+$i-1
done
echo $x
作者: antimatter    时间: 2006-11-29 17:36
个人觉得这个问题首先要把问题的条件限定清楚,做一个较为完整的需求分析。然后我们再根据不同的情况分析。
作者: zwylinux    时间: 2006-12-03 00:27
原帖由 mygod 于 2002-1-30 10:13 发表
[这个贴子最后由mygod在 2002/01/30 10:15am 编辑]

呵呵,偶又生一计:
sed 's/hello/\nhello\n/' test > test1
sed '/hello/' test1 > test2
length=`cat test2 | wc -l`


有错误,呵呵。我拿这个文件来试一下,想找出4的个数,你的脚本只找出了10个
Adams Mary     5346      11/4/63   28765
    Adams Mary     5346      11/4/63   28765

        Tom Jones      4423      5/12/66   543354
Sally Chang    1654      7/22/54   650000
Billy Black    1683      9/23/44   336500
foo fjdkl foo  slkdfj sldfj lsjf
作者: moonlily    时间: 2006-12-03 15:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: twf_cc    时间: 2006-12-03 17:21
原帖由 shirley 于 2002-1-29 10:55 发表
想写这么一个shell script, 找出一个文件比如test中出现hello的次数。
请大家帮帮忙,我还没想出来。


以bash3 的方法
#! /bin/bash
pat=$1
file=$2
[ ! -f "$file" ] || [ $# -ne 2 ] && exit
i=0
for howmany in $(< $file)
   do
      [[ "$howmany" =~ "\<$pat\>" ]] && (( i++ ))
done
echo "$pat:     $i times appeared"
作者: siehon    时间: 2006-12-04 11:40
好贴.好多牛人思路很好,不过不少都没考虑一些特殊情况.
作者: ora_length    时间: 2006-12-04 14:47
# awk -F"hello" '{sum+=NF;sum-=1} END{print sum}' test
作者: jlus    时间: 2006-12-04 15:27
楼上的思路挺牛
不过有空行的时候有点问题吧
作者: jlus    时间: 2006-12-04 15:32
原帖由 antimatter 于 2006-11-29 17:36 发表
个人觉得这个问题首先要把问题的条件限定清楚,做一个较为完整的需求分析。然后我们再根据不同的情况分析。


就是,需求都不清楚怎么做,难道真的要做个通用的?
作者: jlus    时间: 2006-12-04 15:53
原帖由 ora_length 于 2006-12-4 14:47 发表
# awk -F"hello" '{sum+=NF;sum-=1} END{print sum}' test


借用一下




  1. sed 's/hello/hello\n/g' test |sed -n -e '/hello/p'|awk -F"hello" '{sum+=NF;sum-=1} END{print sum}'
复制代码

作者: 26510777    时间: 2007-08-08 22:34
标题: 回复 #1 shirley 的帖子
sed 's/hello/\nhelo\n/g' a.txt|grep -c hello




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2