之后问题澄清:如果时间字段在同一位置总是有相同数量的数字,例如, h:mm:ss.ss
,解决方案可以大大简化。也就是说,我们不需要时间转换成秒,再进行比较,我们可以做一个简单的字符串/逐一比较:
$ awk 'NR==1 {m=M=$3} {$3<m&&m=$3; $3>M&&M=$3} END {printf("min: %s\nmax: %s",m,M)}' file
min: 1:08:22.921
max: 2:22:35.227
的逻辑是相同的,如下面的(以前的)脚本,只是用更简单的仅基于字符串的排序值比较(确定最小/最大值)。我们可以这样做,因为我们知道所有的时间将符合相同的格式,并且如果a < b
(例如"1:22:33" < "1:23:00"
),我们知道a
比b
“小”。 (如果值不一致的格式,然后通过单独使用逐一比较,我们不能命令他们,例如"12:00:00" < "3:00:00"
。)
因此,在第一值读取(第一个记录,NR==1
)中,我们设置初始分钟/读取时间的最大值(在第3个字段中)。对于每个记录,我们测试当前值是否小于当前最小值,如果是,则设置新的最小值。类似的最大。我们使用短路代替if
来缩短表达式($3<m && m=$3
相当于if ($3<m) m=$3
)。在END
我们只需打印结果。
这里的一个一般awk
溶液接受用的位数每个记录小时/分/秒可变数量的时间字符串:
$ awk '{split($3,t,":"); s=t[3]+60*(t[2]+60*t[1]); if (s<min||NR==1) {min=s;min_t=$3}; if (s>max||NR==1) {max=s;max_t=$3}} END{print "min:",min_t; print "max:",max_t}' file
min: 1:22:35.227
max: 10:22:35.228
或者,在一个更可读的形式:
#!/usr/bin/awk -f
{
split($3, t, ":")
s = t[3] + 60 * (t[2] + 60 * t[1])
if (s < min || NR == 1) {
min = s
min_t = $3
}
if (s > max || NR == 1) {
max = s
max_t = $3
}
}
END {
print "min:", min_t
print "max:", max_t
}
对于每一行,我们将时间分量(小时,分钟,秒)从第三场转换为秒whi我们以后可以简单地比较为数字。在迭代时,我们会跟踪当前的最小值和最大值,并在END
中打印它们。最小值和最大值的初始值取自第一行(NR==1
)。
您是否尝试过这样的事情?他们将最后一列分成3列(小时,分钟,秒)并将它们用于排序 https://stackoverflow.com/questions/22053402/awk-is-it-possible-to-read-a-timefield用于分拣 –
只需补充一点,我意识到我尝试的输出是按顺序对它们进行排序,那只是我测试出来的结果是否可以确定最高和最低 - 而不是它是否会打印出于最高和最低,这仅仅是一个起点。最终目标是打印最高时间和最低时间。 –
我有一个在你发送的链接中描述的内容并更新结果。 –