写一个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}"