计算给定数据集的时间差
Calculate time difference for a given dataset
我有一个 down/up 次的列表,需要计算每天的总停机时间
这是原始数据集的片段:
Jan 1 00:09:56 changed state to down
Jan 1 00:10:02 changed state to up
Jan 1 00:10:45 changed state to down
Jan 1 00:10:52 changed state to up
Jan 1 00:11:45 changed state to down
Jan 1 00:11:52 changed state to up
Jan 2 00:14:55 changed state to down
Jan 2 00:15:05 changed state to up
Jan 2 00:15:35 changed state to down
Jan 2 00:16:41 changed state to up
Jan 3 00:05:22 changed state to down
Jan 3 00:05:28 changed state to up
Jan 3 23:59:58 changed state to down
Jan 4 00:00:19 changed state to up
Jan 4 00:49:28 changed state to down
Jan 4 00:49:34 changed state to up
我要的是这样的输出:
Jan 1: 20 seconds
Jan 2: 76 seconds
Jan 3: 27 seconds
Jan 4: 6 seconds
我编写了这个脚本来将时间戳转换为纪元时间:
while read i; do
datetime=$(echo $i | awk '{print " "" "}')
epochtime=$(date -d "$datetime" +\%s)
echo $epochtime
done < ./file
这将给我这样的数据:
1640995796
1640995802
1640995845
1640995852
...
我似乎找不到将它们组合成一行的方法,因此我可以使用此代码(或类似代码):
for i in $epochtime; do
starttime=$(awk '{print }')
endtime=$(awk '{print }')
delta=$(( endtime - starttime ))
echo $delta
done
提前致谢!
$ cat tst.awk
{
prevSecs = currSecs
prevDate = currDate
currDate = " "
= (index("JanFebMarAprMayJunJulAugSepOctNovDec",) + 2) / 3
currSecs = mktime("2022 " gensub(/:/," ","g"), 1)
}
NR%2 == 0 {
dayDeltaSecs += (currSecs - prevSecs)
}
(NR > 1) && (currDate != prevDate) {
printf "%s: %d seconds\n", prevDate, dayDeltaSecs
dayDeltaSecs = 0
}
END {
printf "%s: %d seconds\n", prevDate, dayDeltaSecs
}
$ awk -f tst.awk file
Jan 1: 20 seconds
Jan 2: 76 seconds
Jan 3: 27 seconds
Jan 4: 6 seconds
原回答:
这可能是您尝试使用 GNU awk 实现时间函数的目的:
$ cat tst.awk
{
prevEt = epochtime
= (index("JanFebMarAprMayJunJulAugSepOctNovDec",) + 2) / 3
epochtime = mktime("2022 " gensub(/:/," ","g"), 1)
}
NR%2 == 0 {
print prevEt, epochtime, epochtime - prevEt
}
$ awk -f tst.awk file
1640995796 1640995802 6
1640995845 1640995852 7
我有一个 down/up 次的列表,需要计算每天的总停机时间
这是原始数据集的片段:
Jan 1 00:09:56 changed state to down
Jan 1 00:10:02 changed state to up
Jan 1 00:10:45 changed state to down
Jan 1 00:10:52 changed state to up
Jan 1 00:11:45 changed state to down
Jan 1 00:11:52 changed state to up
Jan 2 00:14:55 changed state to down
Jan 2 00:15:05 changed state to up
Jan 2 00:15:35 changed state to down
Jan 2 00:16:41 changed state to up
Jan 3 00:05:22 changed state to down
Jan 3 00:05:28 changed state to up
Jan 3 23:59:58 changed state to down
Jan 4 00:00:19 changed state to up
Jan 4 00:49:28 changed state to down
Jan 4 00:49:34 changed state to up
我要的是这样的输出:
Jan 1: 20 seconds
Jan 2: 76 seconds
Jan 3: 27 seconds
Jan 4: 6 seconds
我编写了这个脚本来将时间戳转换为纪元时间:
while read i; do
datetime=$(echo $i | awk '{print " "" "}')
epochtime=$(date -d "$datetime" +\%s)
echo $epochtime
done < ./file
这将给我这样的数据:
1640995796
1640995802
1640995845
1640995852
...
我似乎找不到将它们组合成一行的方法,因此我可以使用此代码(或类似代码):
for i in $epochtime; do
starttime=$(awk '{print }')
endtime=$(awk '{print }')
delta=$(( endtime - starttime ))
echo $delta
done
提前致谢!
$ cat tst.awk
{
prevSecs = currSecs
prevDate = currDate
currDate = " "
= (index("JanFebMarAprMayJunJulAugSepOctNovDec",) + 2) / 3
currSecs = mktime("2022 " gensub(/:/," ","g"), 1)
}
NR%2 == 0 {
dayDeltaSecs += (currSecs - prevSecs)
}
(NR > 1) && (currDate != prevDate) {
printf "%s: %d seconds\n", prevDate, dayDeltaSecs
dayDeltaSecs = 0
}
END {
printf "%s: %d seconds\n", prevDate, dayDeltaSecs
}
$ awk -f tst.awk file
Jan 1: 20 seconds
Jan 2: 76 seconds
Jan 3: 27 seconds
Jan 4: 6 seconds
原回答:
这可能是您尝试使用 GNU awk 实现时间函数的目的:
$ cat tst.awk
{
prevEt = epochtime
= (index("JanFebMarAprMayJunJulAugSepOctNovDec",) + 2) / 3
epochtime = mktime("2022 " gensub(/:/," ","g"), 1)
}
NR%2 == 0 {
print prevEt, epochtime, epochtime - prevEt
}
$ awk -f tst.awk file
1640995796 1640995802 6
1640995845 1640995852 7