我有一个制表符分隔的文件,例如,
0018803 01 1710 2050 002571
0018951 01 1934 2525 003277
0019362 02 2404 2415 002829
0019392 01 2621 2820 001924
0019542 01 2208 2413 003434
0019583 01 1815 2134 002971
第 3 列和第 4 列表示 HHMM 格式的开始时间和结束时间。如果开始时间或结束时间超过午夜,它会不断增加小时数。
我希望第 6 列以小时和分钟为单位显示(第 4 列减去第 3 列)的经过时间。
此示例中第 6 列的结果将为3:40
, 5:51
, 00:11
, 1:59
, 2:05
。
答案1
您好,这假设开始时间和结束时间始终为 4 个字符长:
awk 'NF {hrs = substr($4, 1, 2) - substr($3, 1, 2); min = substr($4, 3, 4) - substr($3, 3, 4); if(min<0) {hrs--; min = 60 + min}; printf "%s\t%02d:%02d\n", $0, hrs, min}'
解释:
NF
:字段数,这个是跳过空行
hrs = substr($4, 1, 2) - substr($3, 1, 2);
:获取第4列的前2个字符并减去第3列的前2个字符并赋值给变量hrs
;
min = substr($4, 3, 4) - substr($3, 3, 4);
:用分钟的最后 2 个字符重复最后一个逻辑;
if(min<0) {hrs--; min = 60 + min};
:如果分钟为负数,则小时减 1,并将该负数加上 60 的结果赋给变量min
;
printf "%s\t%02d:%02d\n", $0, hrs, min
:最后打印所有行和变量hrs
并min
补零