How can I read a date written in date.data file in the following format:
year/month/day
date.data
-----------
1815/11/02 Boole, George
1864/06/22 Minkowski, Hermann
1854/04/29 Poincare, Jules Henri
1877/09/11 Jeans, James Hopwood
1826/09/17 Riemann, Georg Friedrich Bernhard
and change it to the following format:
George BOOLE (November 2, 1815)
[user@localhost /tmp/ee]$ cat data
1815/11/02 Boole, George
1864/06/22 Minkowski, Hermann
1854/04/29 Poincare, Jules Henri
1877/09/11 Jeans, James Hopwood
1826/09/17 Riemann, Georg Friedrich Bernhard
[user@localhost /tmp/ee]$ cat conv.pl
#!/usr/bin/perl -n
[user@localhost /tmp/ee]$ cat data | ./conv.pl
George BOOLE (November 2, 1815)
Hermann MINKOWSKI (June 22, 1864)
Jules Henri POINCARE (April 29, 1854)
James Hopwood JEANS (September 11, 1877)
Georg Friedrich Bernhard RIEMANN (September 17, 1826)
[user@localhost /tmp/ee]$
... prolly a programatic way to find the name of the month using strftime() instead of a predefined array but it doens't seem worth the effort here. Should probably also report bogus lines istead of just ignoring them so...
next unless (\/^(\d+)\/(\d+)\/(\d+)\s+([^,]+),\s*(.*)$/);
[user@localhost /tmp/ee]$ cat data
1815/11/02 Boole, George
1864/06/22 Minkowski, Hermann
1854/04/29 Poincare, Jules Henri
1877/09/11 Jeans, James Hopwood
1826/09/17 Riemann, Georg Friedrich Bernhard
[user@localhost /tmp/ee]$ cat conv.pl
#!/usr/bin/perl -n
@mon = ("",
"January",
"March",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
);
next unless (\/^(\d+)\/(\d+)\/(\d+)\s+
$year = $1; $mon = $2; $day = $3;
$last = $4; $first = $5;
printf "%s %s (%s %d, %d)\n",
$first, uc($last), $mon[$mon], $day, $year;
[user@localhost /tmp/ee]$ cat data | ./conv.pl
George BOOLE (November 2, 1815)
Hermann MINKOWSKI (June 22, 1864)
Jules Henri POINCARE (April 29, 1854)
James Hopwood JEANS (September 11, 1877)
Georg Friedrich Bernhard RIEMANN (September 17, 1826)
[user@localhost /tmp/ee]$
... prolly a programatic way to find the name of the month using strftime() instead of a predefined array but it doens't seem worth the effort here. Should probably also report bogus lines istead of just ignoring them so...
next unless (\/^(\d+)\/(\d+)\/(\d+)\s+
... should be more like...
unless (\/^(\d+)\/(\d+)\/(\d+)\s+
print STDERR "unrecongised line: $_";
next;
}