Here is a solution based on a simple Perl script derived from the answer to Convert 12-hour date/time to 24-hour date/time.
Source s12.pl
#!/usr/bin/env perl
use strict;
use warnings;
sub time_12h_to_24h
{
my($t12) = @_;
my($hh,$mm,$ampm) = $t12 =~ m/^(\d\d?):(\d\d?)\s*([AP]M?)/i;
$hh = ($hh % 12) + (($ampm =~ m/AM?/i) ? 0 : 12);
return sprintf("%.2d:%.2d", $hh, $mm);
}
while (<>)
{
my($time_12h, $entry) = split / - /;
my $time_24h = time_12h_to_24h($time_12h);
print "$time_24h $time_12h - $entry";
}
Note that the code accepts both { AM
, PM
} and { A
, P
} and is neutral between upper-case and lower-case for the AM/PM indicator, and ignores spaces between the time and AM/PM indicator.
Input data
This data sets contains rows for 12:05A and 12:05P as well as the data from the question.
03:00P - Doctor appointment.
07:00P - Scheduled entry.
10:30A - Another entry.
11:00A - Daytime medication is due.
11:00P - Nighttime medication is due.
11:30P - Staff meeting.
12:05A - Just past midnight and long before 11:00A.
12:05P - Just past midday and long before 11:00P.
Double-filtered output
$ perl s12.pl data | sort | sed 's/^..:.. //'
12:05A - Just past midnight and long before 11:00A.
10:30A - Another entry.
11:00A - Daytime medication is due.
12:05P - Just past midday and long before 11:00P.
03:00P - Doctor appointment.
07:00P - Scheduled entry.
11:00P - Nighttime medication is due.
11:30P - Staff meeting.
$
Unfiltered output
$ perl s12.pl data | sort
00:05 12:05A - Just past midnight and long before 11:00A.
10:30 10:30A - Another entry.
11:00 11:00A - Daytime medication is due.
12:05 12:05P - Just past midday and long before 11:00P.
15:00 03:00P - Doctor appointment.
19:00 07:00P - Scheduled entry.
23:00 11:00P - Nighttime medication is due.
23:30 11:30P - Staff meeting.
$
Note that by placing the key column (24 hour time column) first in the output, the sort
command is simplified (and, in general, it speeds up the sort too).