写一个bash脚本,统计一个文本文件nowcoder.txt中每一行出现的1~5数字的个数,并且计算一下整个文档中一共出现了几个1~5数字的总数。
示例:
假设 nowcoder.txt 内容如下:
a12b8
10ccc
2521abc
9asf
你的脚本应当输出:
line1 number: 2
line2 number: 1
line3 number: 4
line4 number: 0
sum is 7
说明:
不要担心你输出的空格以及换行的问题
a12b8 10ccc 2521abc 9asf
line1 number: 2 line2 number: 1 line3 number: 4 line4 number: 0 sum is 7
cnt=1 sum=0 while read line do r=`echo $line | grep -oE "[12345]" | wc -l` echo "line${cnt} number: ${r}" let "cnt++" let "sum+=$r" done echo "sum is ${sum}" < nowcoder.txt
awk '{ gsub(/[^1-5]/,"",$0); print "line"NR" number: "length($0); sum+=length($0); } END{ print "sum is "sum }'
idx=1 sum=0 while read line do num=$(echo $line |grep -o [1-5]|wc -l) echo "line$idx number:" $num let idx=$idx+1 # 这行等同于 $idx++ let sum=$sum+$num done echo "sum is"$sum ### 对上面的命令解读: ## grep -o 的用法匹配满足条件的字符,举例如下,你一看就懂 # echo a123kk |grep -o [1-9] 1 2 3 # echo a123kk |grep -o [a-z] a k k # echo a123kk |grep -o a1 a1 ## let 是shell命令运算符,用于整数运算,举例如下 # let a=1+3;echo $a 4
awk -F "[1,2,3,4,5]" 'BEGIN{sum=0}{print "line"NR" number:"(NF-1);sum+=(NF-1)}END{print "sum is "sum}' nowcoder.txt
awk -F '' '{ cnt[NR]=0 #注意cnt[NR]初始化为0;否则不会记录没有1~5数字的行 for(i=1;i<=NF;i++){ if($i~/[1-5]/){ #注意这里需要加上//表示正则 sum++ cnt[NR]++ #注意这里使用了行号NR } } }END{ for(j in cnt){ printf("line%d number: %d\n",j,cnt[j]) #可以使用print来打印更方便简洁 } printf("sum is %d",sum) }' nowcoder.txt
#!/bin/bash line_number=0 while IFS= read -r line; do ((line_number++)) count=$(echo "$line" | tr -dc "1-5" | wc -m) ((sum += count)) echo "line${line_number} number: ${count}" done echo "sum is ${sum:-0}"