我有一个文本文件,其中包含飞行时间、小时和分钟,用冒号分隔,每行一个:
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:
(使用 GNU awk):
awk -F : '{acch+=$1;accm+=$2;} ENDFILE { \ print acch+int(accm/60) ":" accm%60; }' [inputfile]
(使用“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