简洁且成功的代码:
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh
#!/bin/bash
startTime=`date +"%s.%N"`
#bwa aln ../GCA_000001405.15_GRCh38/GCA_000001405.15_GRCh38_full_analysis_set.fna ../SRR003161h20.fastq > SRR003161h20t1.sai
for((i=1;i<=400;i++));do echo $(expr $i \* 4);done
endTime=`date +"%s.%N"`
echo `awk -v x1="$(echo $endTime | cut -d '.' -f 1)" -v x2="$(echo $startTime | cut -d '.' -f 1)" -v y1="$[$(echo $endTime | cut -d '.' -f 2) / 1000]" -v y2="$[$(echo $startTime | cut -d '.' -f 2) /1000]" 'BEGIN{printf "RunTIme:%.6f s",(x1-x2)+(y1-y2)/1000000}'`
运行结果1:
... ...
1568
1572
1576
1580
1584
1588
1592
1596
1600
RunTIme:0.505397 s
运行结果2(需要配置bwa程序):
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh
[bwa_aln] 17bp reads: max_diff = 2
[bwa_aln] 38bp reads: max_diff = 3
[bwa_aln] 64bp reads: max_diff = 4
[bwa_aln] 93bp reads: max_diff = 5
[bwa_aln] 124bp reads: max_diff = 6
[bwa_aln] 157bp reads: max_diff = 7
[bwa_aln] 190bp reads: max_diff = 8
[bwa_aln] 225bp reads: max_diff = 9
[main] Version: 0.7.12-r1039
[main] CMD: bwa aln ../GCA_000001405.15_GRCh38/GCA_000001405.15_GRCh38_full_analysis_set.fna ../SRR003161h20.fastq
[main] Real time: 36.195 sec; CPU: 3.575 sec
RunTIme:36.265438 s
可以看出来调用程序时间稍大于程序内部自己内测时间,正常。
程序说明:
startTimeS1=$(echo $startTime | cut -d '.' -f 1)
startTimeS2=$[$(echo $startTime | cut -d '.' -f 2) /1000]
endTimeS1=$(echo $endTime | cut -d '.' -f 1)
endTimeS2=$[$(echo $endTime | cut -d '.' -f 2) / 1000]
详细可参考最后一个调试(调试5)
总结:参考指令
awk
|bc
expr
$[]
毫秒和纳秒时间可调。
可以忽略一下,仅自己参考、记录
调试1(有错误):
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh
#!/bin/bash
startTime=`date +"%Y-%m-%d %H:%M:%S.%N"`
for((i=1;i<=10;i++));do echo $(expr $i \* 4);done
endTime=`date +"%Y-%m-%d %H:%M:%S.%N"`
echo "startTime "$startTime
echo "endTime "$endTime
startTimeS1=$(echo $startTime | cut -d '.' -f 1)
startTimeS2=$(echo $startTime | cut -d '.' -f 2)
#startTimeS1= cut -d '.' -f 1 $startTime
#startTimeS2= cut -d '.' -f 2 $endTime
endTimeS1=$(echo $endTime | cut -d '.' -f 1)
endTimeS2=$(echo $endTime | cut -d '.' -f 2)
echo $startTimeS1
echo $endTimeS1
echo $startTimeS2
echo $endTimeS2
startTimeS1Linux=`date -d "$startTimeS1" +%s` #把当前时间转化为Linux时间
endTimeS1Linux=`date -d "$endTimeS1" +%s`
startTimeS2Linux=`date -d "$startTimeS2" +%s` #把当前时间转化为Linux时间
endTimeS1L2nux=`date -d "$endTimeS2" +%s`
echo $startTimeS1Linux
echo $endTimeS1Linux
echo $startTimeS2Linux
echo $endTimeS2Linux
s=`expr $endTimeS1Linux - $startTimeS1Linux` #计算2个时间的差
#ns=`expr $endTimeS2Linux - $startTimeS2Linux` #计算2个时间的差
ns=`expr $endTimeS2 - $startTimeS2` #计算2个时间的差
echo $s.$ns
运行结果:
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh
4
8
12
16
20
24
28
32
36
40
startTime 2016-03-14 21:46:10.065302995
endTime 2016-03-14 21:46:10.078381939
2016-03-14 21:46:10
2016-03-14 21:46:10
065302995
078381939
date: invalid date ‘065302995’
date: invalid date ‘078381939’
1457963170
1457963170
0.13078944
调试2(有错误):
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh
#!/bin/bash
startTime=`date +"%Y-%m-%d %H:%M:%S.%N"`
for((i=1;i<=10;i++));do echo $(expr $i \* 4);done
endTime=`date +"%Y-%m-%d %H:%M:%S.%N"`
startTimeS1=$(echo $startTime | cut -d '.' -f 1)
startTimeS2=$(echo $startTime | cut -d '.' -f 2)
endTimeS1=$(echo $endTime | cut -d '.' -f 1)
endTimeS2=$(echo $endTime | cut -d '.' -f 2)
startTimeS1Linux=`date -d "$startTimeS1" +%s` #把当前时间转化为Linux时间
endTimeS1Linux=`date -d "$endTimeS1" +%s`
echo "RunTime:"`expr $endTimeS1Linux - $startTimeS1Linux`.`expr $endTimeS2 - $startTimeS2`"s"
输出:
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh
4
8
12
16
20
24
28
32
36
40
RunTime:0.13458804s
调试3(有错误):
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh
#!/bin/bash
startTime=`date +"%s.%N"`
for((i=1;i<=10;i++));do echo $(expr $i \* 4);done
endTime=`date +"%s.%N"`
startTimeS1=$(echo $startTime | cut -d '.' -f 1)
startTimeS2=$(echo $startTime | cut -d '.' -f 2)
endTimeS1=$(echo $endTime | cut -d '.' -f 1)
endTimeS2=$(echo $endTime | cut -d '.' -f 2)
echo "RunTime:"`expr $endTimeS1 - $startTimeS1`.`expr $endTimeS2 - $startTimeS2`"s"
输出:
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh
4
8
12
16
20
24
28
32
36
40
RunTime:0.13124421s
<span style="font-size: 13.3333px;">调试4(有错误):</span>
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ cat a.sh
#!/bin/bash
startTime=`date +"%s.%N"`
for((i=1;i<=10;i++));do echo $(expr $i \* 4);done
endTime=`date +"%s.%N"`
echo "RunTime:"`expr $(echo $endTime | cut -d '.' -f 1) - $(echo $startTime | cut -d '.' -f 1)`.`expr $(echo $endTime | cut -d '.' -f 2) - $(echo $startTime | cut -d '.' -f 2)`"s"
输出:
hadoop@Mcnode1:~/cloud/adam/xubo/data/test20160310/test$ ./a.sh
4
8
12
16
20
24
28
32
36
40
RunTime:0.13331374s
前面几种没有考虑结束的纳秒比开始的纳秒小,会出现负数,故需要修改:
调试5(有错误):
#!/bin/bash
#echo "hello"
#bwa aln ../GCA_000001405.15_GRCh38/GCA_000001405.15_GRCh38_full_analysis_set.fna ../SRR003161h20.fastq > SRR003161h20t1.sai
startTime=`date +"%s.%N"`
bwa aln ../GCA_000001405.15_GRCh38/GCA_000001405.15_GRCh38_full_analysis_set.fna ../SRR003161h20.fastq > SRR003161h20t1.sai
# for((i=1;i<=400;i++));do echo $(expr $i \* 4);done
endTime=`date +"%s.%N"`
echo "startTime "$startTime
echo "endTime "$endTime
startTimeS1=$(echo $startTime | cut -d '.' -f 1)
startTimeS2=$[$(echo $startTime | cut -d '.' -f 2) /1000]
endTimeS1=$(echo $endTime | cut -d '.' -f 1)
endTimeS2=$[$(echo $endTime | cut -d '.' -f 2) / 1000]
#echo $Scha
#echo `awk -v x1="$endTimeS1" -v x2="$startTimeS1" -v y1="$endTimeS2" -v y2="$startTimeS2" 'BEGIN{printf "product0:1-%f,2-%.3f,sum-%.3f",x1-x2,y1-y2,(x1-x2)+(y1/1000-y2/1000)}'`
echo `awk -v x1="$endTimeS1" -v x2="$startTimeS1" -v y1="$endTimeS2" -v y2="$startTimeS2" 'BEGIN{printf "RunTIme:%.6f s",(x1-x2)+(y1-y2)/1000000}'`
#echo $product0
#if [ $endTimeS2 -lt $startTimeS2 ]; then
# echo `awk -v x1="$endTimeS1" -v x2="$startTimeS1" -v y1="$endTimeS2" -v y2="$startTimeS2" 'BEGIN{printf "RunTIme:%.3f s",(x1-x2)+(y1/1000-y2/1000)}'`
#echo 'awk -v x="$endTime" 'BEGIN{printf("%f",x*2}''
#echo "scale=3;$[$[$endTimeS2-1]-$startTimeS2]+$s2" |bc
#echo "RunTime:" $ $[$(echo $endTime | cut -d '.' -f 1)-1] - $(echo $startTime | cut -d '.' -f 1) + $[$( $[ $(echo $endTime | cut -d '.' -f 2)+1000000000] - $(echo $startTime | cut -d '.' -f 2)) / 10000000 ]"s"
#else
#echo `awk -v x1="$endTimeS1" -v x2="$startTimeS1" -v y1="$endTimeS2" -v y2="$startTimeS2" 'BEGIN{printf "RunTIme:%.3f s",(x1-x2-1)+(y1/1000-y2/1000)}'`
#echo "RunTime:" $[$[$endTimeS2-1]-$startTimeS2].$[$[$[$endTimeS1+1000]-$statTimeS1] / 1000]
#echo "RunTime:"`expr $(echo $endTime | cut -d '.' -f 1) - $(echo $startTime | cut -d '.' -f 1)`.`expr $(echo $endTime | cut -d '.' -f 2) - $(echo $startTime | cut -d '.' -f 2)`"s"
#fi
# exec_time_ms=$[$[$[ 10#$(echo $endTime | cut -d '.' -f 1) - 10#$(echo $startTime | cut -d '.' -f 1)] * 1000] + $[$[10#$(echo $endTime | cut -d '.' -f 2) / 1000000] - $[10#$(echo $startTime | cut -d '.' -f 2) / 1000000] ] ]
# nowdate=`date +%Y%m%d-%T`
# echo "--------$nowdate-------->":$exec_time_ms
#current=`date "+%Y-%m-%d %H:%M:%S"` #获取当前时间,例:2015-03-11 12:33:41
#timeStamp=`date -d "$current" +%s` #将current转换为时间戳,精确到秒
#currentTimeStamp=$((timeStamp*1000+`date "+%N"`/1000000)) #将current转换为时间戳,精确到毫秒
#echo $currentTimeStamp
shell运算参考:【4】
虽然Bash shell 有四种算术运算方法,但并不是每一种都是跨平台的,建议使用expr。
另外,我们在 script 中经常有加1操作,以下四法皆可:
m=$[ m + 1]
m=`expr $m + 1`
m=$(($m + 1))
let m=m+1
另外,还可以使用bc
m=`echo "( $a - 1 )*$b +1" |bc`
参考文献:
【1】 http://blog.csdn.net/foxliucong/article/details/4225008
【2】 http://blog.csdn.net/gengshenghong/article/details/7583580
【3】 http://blog.sina.com.cn/s/blog_9d074aae01012ytf.html
【4】 http://blog.chinaunix.net/uid-209416-id-2410742.html
【5】http://blog.jobbole.com/92430/
【6】http://www.centoscn.com/shell/2013/0802/884.html