我在shell脚本中使用了一个while循环来计算file.txt的12:00:00到18:00:00之间的行数,并且脚本运行良好。现在我想扩展此过程以计算以下时间步之间的行数:
00:00:00 and 05:59:59;
06:00:00 and 11:59:59;
12:00:00 and 17:59:59;
18:00:00 and 23:59:59;
查看第一个脚本,然后是结果
#!/bin/bash
let count=0
while read cdat ctim clat clon
do
h=${ctim:0:2}; # substring hours from ctim
m=${ctim:3:2};
s=${ctim:6:2};
if [[ $h -ge 12 && $h -le 17 ]] || [[ $ctim == "18:00:00" ]]; then
let count=$count+1
echo $count $cdat $ctim $clat $clon
fi
done < cloud.txt
echo $count
exit
结果:
1 2014/11/21 16:05:00 19.56 -05.30
2 2014/01/31 13:55:00 02.00 31.10
3 2014/04/00 14:20:00 17.42 12.14
4 2014/07/25 15:30:00 35.25 05.90
5 2014/05/15 12:07:00 23.95 07.11
6 2014/07/29 17:34:00 44.00 17.43
7 2014/03/20 18:00:00 -11.12 -22.05
8 2014/09/21 12:00:00 06.44 41.55
8
我想做同样的事情,根据相应的时间步骤得到不同的结果,但是在同一个脚本中。我想逐一打印出与上面不同的结果。
答案 0 :(得分:0)
我会编辑你的初始脚本,把开始和结束时间作为一个参数,然后编写第二个脚本,给你第一个你想要的时间值(只是一个开始和结束时间的列表,也许是一个输出文件,如果你想要计数是分开的)。您需要编辑第一个脚本以忽略开始时间之前的所有内容,然后将18:00:00抽出并用endtime变量替换它。
这样,您可以轻松地在任何时间段内运行报告,并且您已经设置了逻辑来计算必要的数据。
答案 1 :(得分:0)
count=()
total=0
while read cdat ctim rest; do
if [[ $ctim == "00:00:00" ]] || [[ "00:00:00" < $ctim && $ctim < "06:00:00" ]]; then
index=0
elif [[ $ctim == "06:00:00" ]] || [[ "06:00:00" < $ctim && $ctim < "12:00:00" ]]; then
index=6
elif [[ $ctim == "12:00:00" ]] || [[ "12:00:00" < $ctim && $ctim < "18:00:00" ]]; then
index=12
else
index=18
fi
(( count[index]++ ))
(( total ++ ))
echo ${count[index]} $cdat $ctim $rest
done < file
for index in 0 6 12 18; do
echo "count between $index and $((index+6)): ${count[index]}"
done
echo total count: $total