2014-09-22shell脚本练习题

回复 收藏
我承诺给大家的,要连续发出shell脚本练习题,我做到了。你能每个脚本都去动手写写吗?我希望你也能做到!

今日练习题: 计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字。例如a.txt内容如下:
12aa*lkjskdj
alskdflkskdjflkjj

我们脚本名字为 ncount.sh, 运行它时:
bash ncount.sh a.txt
输入结果应该为:
2
0
sum:2

如果你使用while循环,不要写成这样的形式:cat a.txt |while read line ; do .... ;done  
应该是这样的形式:
while read line ; do ... ;done
2014-09-21 20:10 举报
已邀请:
0

陈沛

赞同来自:

本帖最后由 陈沛 于 2014-9-22 08:40 编辑

#/bin/bash
# 2014-09-21
# chenpei

fileName=$1
#判读文件是否存在
if [ ! -f  $fileName ]
then         
    exit;
fi

#每行出现数字次数
for i in `cat $fileName`
do
    echo $[ `echo $i | wc -m`-`echo $i | sed 's#[0-9]##g' | wc -m` ]
done

#文档中数字总共出现次数
echo -e "sum:" $[`cat  $fileName | wc -m`-`cat  $fileName | sed 's#[0-9]##g' | wc -m`]








0

wyatt88

赞同来自:

  1. #!/bin/bash
  2. #ww

  3. sum=0
  4. filename=$1

  5. if [ -f $filename ]
  6. then
  7.    >.count
  8.    lines=`cat $filename|wc -l`
  9.    for i in `seq 1 $lines`
  10.    do
  11.      count=`sed 's/[^0-9]//g' $filename | sed -n "$i"'p'|wc -m`
  12.      
  13.      c=`echo "$count-1"|bc`
  14.      echo $c
  15.      sum=$[$c+$sum]
  16.    done
  17. #   cat .count
  18.    echo "sum:$sum"
  19. else
  20.    echo "$filename is not a file"
  21.    echo "sh ncount.sh filename"
  22. fi
0

zyfeifie

赞同来自:

本帖最后由 zyfeifie 于 2014-9-22 10:26 编辑

#!/bin/bash
sum=0
if [ ! -f $1 ];
then
echo "the file $1 is not exists."
exit
fi
for i in `cat $1`
do
  num=`echo -n $i | sed  's/[^0-9]//g' |wc -m`
  sum=$[$sum+$num]
  echo $num
done
echo "sum: $sum"
0

Louis

赞同来自:

  1. #!/bin/bash
  2. ## This script is for echo length of number in a file every row and count.
  3. ## Written by Louis at 2014/09/22 10:15

  4. sum=0
  5. for i in `cat a.txt`; do
  6.     num=`echo $i|grep -o '[0-9]*'`
  7.     len=`expr length "$num"`
  8.     echo $len
  9.     sum=$[$sum+$len]
  10. done
  11. echo "sum:"$sum


0

寒一

赞同来自:

#!/bin/bash

#file=$1
if [ ! -f $1 ] || [ ! -s $1 ]
then
    echo "Please input a exists and isn't empty file!"
    exit
fi

n=`awk 'END {print NR}' $1`
row=1
sum=0
while [ $row -le $n ]
do
   c=`sed -n "$[row]"p $1 |grep -o '[0-9]' |wc -l`
   row=$[$row+1]
   sum=$[$sum+$c]
   echo $c
done
   echo "sum:$sum"
0

齐天大圣

赞同来自:

本帖最后由 齐天大圣 于 2014-9-22 12:18 编辑
  1. #!/bin/bash
  2. #The num sum of each line.
  3. #2014-09-22.

  4. file="$1"
  5. n=`wc -l $file |cut -d' ' -f1`
  6. for i in `seq 1 $n`
  7. do
  8.   m=`sed -n "$i"p $file |sed 's/[^0-9]//g' |wc -c`
  9.   m1=$[$m-1]
  10.   echo $m1>>/root/sum.txt
  11. done
  12. sum=`cat sum.txt |xargs |sed 's/ /+/g' |bc`
  13. echo "sum:$sum">>sum.txt
  14. cat /root/sum.txt
  15. rm -f /root/sum.txt
0

ocean

赞同来自:

本帖最后由 ocean 于 2014-9-22 12:53 编辑
  1. [root@www ~]# cat 0922.bash
  2. #!/bin/bash
  3. # Desc: Count number of each line, and count sum.
  4. # Writen by Jeffery.Su
  5. # Date: Sep,22 2014

  6. function NUM_COUNT () {
  7. sed s/[^0-9]//g  $1 > $1.tmp
  8. awk  '{print "line:"NR,"\t"length($1)}' $1.tmp | tee $1.tmp2
  9. awk  'BEGIN{sum=0}{sum+=$2}END{printf "%s %d\n" ,"sum:" ,sum}' $1.tmp2
  10. rm -rf $1.tmp*
  11. }
  12. NUM_COUNT $1
{:5_121:}
0

小雨

赞同来自:

#!/bin/bash

sun=0
sed 's/[^0-9]//g' $1 > result.txt
while read row
do
        echo ${row} > temp.dat
        a=`wc -c temp.dat | awk '{print $1-1}'`
        echo $a
        sun=$[${sun}+$a]
done < result.txt
echo "sum:${sun}"
0

木字当头

赞同来自:

参考
0

Stary-liu

赞同来自:

参考一下,这个写的有一点困难,老报错
0

So Long

赞同来自:

本帖最后由 程城 于 2014-9-22 17:07 编辑

#!/bin/bash
#written by chengcheng
sum=0
for i in `cat a.txt|xargs`;do
        a=`echo $i |wc -m`
        b=`echo $i |sed 's/[0-9]//g'|wc -m`
        c=$[$a-$b]
        echo $c
        sum=$[$c+$sum]
done
        echo $sum
结果:#sh 0922.sh
2
0
2


0

zhangyu201407

赞同来自:

学习
0

鸵鸟

赞同来自:

学习
0

路过

赞同来自:

看下
0

楓瀛夢鞢

赞同来自:

while read line;do
a=`echo $line |sed 's/[^0-9]//g'|wc -c`
echo $a
done <$1
后面不知道怎么写了
0

楓瀛夢鞢

赞同来自:

#! /bin/bash
while read line ;do
a=`echo $line|sed 's/[^0-9]//g'|wc -c`
echo $a
done <$1

sum=0
for i in `cat -A $1`;do
n=`echo -n $i|sed 's/[^0-9]//g'|wc -c`
sum=$[$sum+$n]
done
echo "sum:$sum"
0

Budweiser小王子

赞同来自:

局部参考代码
0

齐天大圣

赞同来自:


现在的shell写的短多了{:4_117:}{:4_98:}
0

ocean

赞同来自:

齐天大圣 发表于 2014-9-26 17:26
现在的shell写的短多了

见笑 见笑{:5_125:}
0

第六感

赞同来自:

  1. #!/bin/bash
  2. #
  3. if [ ! -f $1 ] ;then
  4.   echo "file is not exist"
  5.   exit
  6. else
  7.   Line=`cat /root/$1|wc -l`
  8.   for I in `seq 1 $Line`;do
  9.      num=`sed -n "$I"p $1|sed 's#[^0-9]##g'`
  10.      len=`expr length "$num"`
  11.      echo $len
  12.      let sum+=$len
  13.   done
  14.   echo $sum
  15. fi

0

butterfly梧桐雨

赞同来自:

本帖最后由 butterfly梧桐雨 于 2014-10-10 15:31 编辑

只想出来一部分,先回帖瞧一些答案
[yunzhuw@APT_SH-01 ~/workspace/shell_practice/aming]$ sed 's/[^0-9]//g' a.txt
12
==========================
参考了老师的答案以后,如下:
#!/bin/bash
#practice
sum=0
for fline in `cat $1`
do
    i=`echo -n $fline |sed 's/[^0-9]//g'| wc -m`
    echo $i
    sum=$[$sum+$i]
done
echo 'sum:'$sum
==========================
一些感想:
原本以为很简单的,不就数个数么,后来发现远非自己想的那么简单,很多东西时间长了有些忘记,各种感慨啊
1)cat以后再用for可以逐个读取行,又没想起来,打板子
2)sed,wc命令报错说不是文件或文件夹时,可以用echo,继续打板子
3)echo -n 去除行位换行符的统计
4)先读取每行后再进行sed,wc,对于统计结果为0的行很有效,老师英明啊
5)有其他同学先判断文件是否存在的,特别好,有专业范儿,学习了

谢谢大家,share了这么好的东西,尤其阿铭老师,后面的作业一定补上


0

pykihwfn

赞同来自:


#/bin/bash
#writen by alex on 2014.11.22 about findnum
a=0
for i in `cat /test/nap.txt`;do

        sum=`echo $i|sed 's#[^0-9]##g'|wc -m`
        echo $sum
        a=$[$a+$sum]
        done
        echo "全文数字总计为:"$a
0

cmzsteven

赞同来自:

{:4_91:}
0

chekir

赞同来自:

看看。
0

sss

赞同来自:

本帖最后由 sss 于 2015-6-12 15:13 编辑
  1. #!/bin.bash
  2. #Ian statistics document a few figures
  3. #2015/05/19
  4. sum=0
  5. for i in `cat $1`
  6. do
  7.         num=`echo -n $i | sed 's/[^0-9]//g' | wc -c`
  8.         echo $num
  9.        ((sum=$sum+$num))
  10. done
  11. echo "sum:"$sum


0

狠懒

赞同来自:

参考学习
0

狠懒

赞同来自:

参考学习
0

来点情绪

赞同来自:

参考一下
0

哈哈琨少

赞同来自:

学习学习
0

llzdwyp

赞同来自:

grep [0-9] a.txt|sed 's/[^0-9]/ /g' |sed 's/[^0-9]//g'|wc -m
0

一笑而过

赞同来自:

学习一下;
0

一笑而过

赞同来自:

#!/bin/bash
#The script was Wriiten by Xusj at 20150728.
sum=0
for i in `cat -A a.txt`
do
n=`echo -n $i|sed 's/[^0-9]//g'|wc -c`
echo $n
sum=$[$sum+$n]
done
echo "sum:"$sum
0

鑫柏

赞同来自:

{:4_111:}
0

渐行渐远

赞同来自:

学习
0

wzwyql

赞同来自:

1
0

不怕不怕

赞同来自:

看看学习
0

ldp840611

赞同来自:

看看
0

Rohero

赞同来自:

xuexi
0

石头

赞同来自:

{:4_91:}
0

翟厚翔

赞同来自:

while read line   do       echo "$line" > m.txt       c=`sed -r 's/[^0-9]//g' m.txt|wc -m`       let b=$c-1       echo "$b  "       let  sum+=$b done
0

J!_yuan

赞同来自:

  1. #/bin/bash

  2. if [ ! -f  $1 && -z $1 ]
  3. then
  4.     exit 0
  5. fi

  6. for i in `cat $1|sed 's/[^0-9]//g'`
  7. do
  8.     echo $[ `echo $i | wc -m` ]
  9. done

  10. echo  "sum:" $[`cat  $1 | sed 's/[^0-9]//g'| wc -m`]
0

蓝色风暴

赞同来自:

本帖最后由 蓝色风暴 于 2015-12-24 15:30 编辑

#!/bin/bash

sum=0
sed 's/[^0-9]//g' /etc/passwd > /tmp/1.txt
for i in `cat /tmp/1.txt`
        do
                num=`echo "$i" | wc -m`
                echo "$[ $num-1 ]"
                sum=$[ $sum+$num-1 ]
        done
echo "$sum"
0

369666951

赞同来自:

1
0

出VU时代

赞同来自:

学习了
0

Landon

赞同来自:

asd
0

hlymlv

赞同来自:

#!/bin/bash
file=/etc/passwd
c=`cat /etc/passwd |wc -l`
sum=0
for i in `seq 1 $c`;do
n=`sed -n "$i"p $file |sed 's/[^0-9]//g'`
l=`expr length $n`
sum=$[$sum+$l]
echo $l
done
echo "sum:$sum"
0

xteplinux

赞同来自:

{:4_91:}
0

licengceng

赞同来自:

学习
0

lin19890913

赞同来自:

看看
0

lyhabc

赞同来自:

不会了  
0

lyhabc

赞同来自:

关键是cat -A  wc -c 无法识别数字
#!/bin/bash
sum=0
sumcount=0
sed -i.bak 's/[^0-9]/ /g' $1
n=`wc -l $1 |awk '{print $1}'`
for i in `seq 1 $n`
do
        sumcount=`echo $i|wc -c `
        echo "count in this line: $sumcount"
        sum=$[$sum+$sumcount]
done
echo $sum
0

落涧飞鹰

赞同来自:

看看
0

thedawn

赞同来自:

1
0

zhangzihao

赞同来自:

看看
0

北辰星

赞同来自:

学习
0

我是学渣

赞同来自:

{:4_99:}
0

HwangChen

赞同来自:

kankan
0

lin13750529011

赞同来自:

谢谢
0

bbcw

赞同来自:

  1. #!/bin/bash
  2. FILE=$1
  3. m=0
  4. for i in `cat $FILE`;do
  5.     NUM=`echo $i|sed 's/[a-Z]//g'|sed 's/\W//g'|wc -m`
  6.     let NUM=NUM-1
  7.     #因为每一行都有个$,所以需要减一
  8.     echo $NUM
  9.     let m=m+NUM
  10. done
  11. echo $m
0

大仔黑黑

赞同来自:

看答案
0

cxiaodian

赞同来自:

d
0

elvis

赞同来自:

ddd
0

大喵喵66

赞同来自:

  1. #!/bin/bash
  2. ## 计算每行有几个数字,统计总共有多少数字
  3. sum=0
  4. while read LINE; do
  5.         tmp=$((`echo $LINE |sed 's/[^0-9]//g' |wc -m` - 1))
  6.         echo $tmp
  7.         let sum+=tmp
  8. done < a.txt
  9. echo "sum: $sum"
0

branttsai

赞同来自:

study, tks
0

xueyongbo

赞同来自:

参考
0

xzzlamp

赞同来自:

11
0

jonnylin

赞同来自:

学习
0

我爱我家

赞同来自:

答案
0

alvinnull

赞同来自:

xuexi
0

monga

赞同来自:

学习
0

lanceli

赞同来自:

kankan
0

小毅

赞同来自:

#!/bin/bash
while read line
do
echo $line|grep -o "[0-9]"
done<1.txt
echo -e "sum: `grep -o "[0-9]" 1.txt|wc -l`"
0

kevinjin

赞同来自:

对每一行的数字进行计数的方法不知道
0

kevinjin

赞同来自:

#! /bin/bash
sum=0
for i in `cat -A a.txt`
do
    n=`echo -n $i |sed 's/[^0-9]//g' |wc -c`
    echo $n
    sum=$[$sum+$n]
done
echo "sum: "$sum
0

kevinjin

赞同来自:

echo -n $i 中的 -n 是为了把空行去掉,否则wc -c 之后输出的数会包含 \n 这个空行,空行原来也算一个字符
0

hhao

赞同来自:

1
0

Bullet_Point

赞同来自:

1
0

riverxyz

赞同来自:

还是不懂{:4_99:}
0

linuxcp

赞同来自:

{:4_91:}
0

zyos

赞同来自:

#!/bin/bash
##作业要求,计算某个文本每行出现有几个数字。
##并计算出数字出现的总和。
## 以passwd 文件为例
## 用法:sh a.sh /etc/passwd
sum=0
#定义sum的结果为0
exec < $1
#在当前的shell中读入$1的内容
while read line
  do
   number=`echo $line|sed 's/[^0-9]//g'|wc -L`
   #读取每行的数字   
echo $number
   sum=$[$sum+$number]
   #将结果相加
done

echo $sum

0

J_C

赞同来自:

看答案
0

ChrisLinux

赞同来自:

不会啊  汗,回个水楼蹭个答案看看。题面已经不上用cat了,回复里还好多用cat filename
0

15812926028

赞同来自:

look
0

leewillxlw

赞同来自:

最后卡住了
0

chenlei82486708

赞同来自:

学习
0

ryanlin

赞同来自:

学习
0

冷凌

赞同来自:

学习
0

标哥

赞同来自:

  1. #!/bin/bash
  2. count=0
  3. sum=0
  4. while  read line
  5. do
  6.    count=`echo $line| grep -o '[0-9]'   |wc -l `
  7.    echo "count: $count"
  8.    let "sum +=count"
  9. done < $1
  10. echo "sum: $sum"


测试通过,仅供参考。
0

kw是id

赞同来自:

#!/bin/bash
dir=/usr/local/sbin
a=`cat $dir/1.txt |grep -o '[0-9]*'`
b=`cat $dir/1.txt |grep -o '[0-9]'`
d=0
for i in $a
do
   echo $i
done
for c in $b
do
    if [ -n "$c" ]
    then
        let d=d+1
    fi
done
echo $d

0

大雁

赞同来自:

有点懵,学习下

0

王斌

赞同来自:

看了下面的回复,忘记使用了 sed 的替换功能

另外了解了 length 函数

0

jadga1126

赞同来自:

学习

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
  • 评分区间
  • 学分
  • -30 ~ 30
可选评分理由: