如何使用命令行对文本文件中的时间求和?

如何使用命令行对文本文件中的时间求和?

我有一个文本文件,其中包含飞行时间、小时和分钟,用冒号分隔,每行一个:

00:50
00:41
00:43
00:50
01:24

我目前正在使用苹果的 Numbers 应用程序,通过一个简单的公式来计算总时间(结果是4:28对于上面的示例数据)。

但是,我想知道是否有更简单的方法来实现这一目标。 Perl 脚本可以正常工作,但是使用 Unix shell 命令和/或脚本怎么样?我基本上在寻找任何简短的东西。

是的,我可以用数字来管理,但是了解和学习这会很高兴:)。

ps 发布 perl 脚本来实现此目的,以防其他人需要它:

#! /usr/bin/perl
while (<>) {
  chomp;
  ($hours, $minutes) = split (/:/, $_);
  $totalhours += $hours;
  $totalminutes += $minutes; 
}
while ($totalminutes > 59) {
  $totalhours++;
  $totalminutes -= 60;
}
printf ("%d:%02d\n", $totalhours, $totalminutes);

答案1

正如您所注意到的,有很多可能性。以下带有 awk 的版本大致相当于您问题中包含的 perl:

  1. (使用 GNU awk):

    awk -F : '{acch+=$1;accm+=$2;} ENDFILE { \
    print acch+int(accm/60)  ":" accm%60; }' [inputfile]
    
  2. (使用“POSIX”awk):

    awk -F : '{acch+=$1;accm+=$2;print acch+int(accm/60) \
                 ":" accm%60; }' [inputfile] | tail -1
    

答案2

Perl 中的“一行”版本:

perl -F: -lane '$a+=$F[0]*60+$F[1];END{printf "%02d:%02d\n",$a/60,$a%60}' file

答案3

这应该适用于任何 POSIX 兼容的 shell:

#!/bin/sh
# usage: time-add.sh < times.txt
sum=0
while IFS=: read -r hours minutes; do
    sum=$(($sum + $hours * 60 + $minutes))
done
total=$(($sum / 60)):$(($sum % 60))
echo $total

相关内容