0

I have a human written text file that contains time stamps in form of dd-mm-yyyy,HH:MM or HH:MM:SS. I have managed to extract time stamps from text file using regex but I would like to also get a line of corresponding time stamp. It would be nice to have time stamps in one file and corresponding lines in the other. There could be multiple time stamps per line so same line should occur multiple times.

If this can be done, what if I want only few words or few lines around a time stamp. Idea is just to get time stamps and their context extracted.

For now I have been using matlab for this, but any *nix tool will do.

Edit: seems to be that not all tools will do. I'm using mac and sometimes portable git bash for windows. At least mac's grep doesn't support anymore -P options for perl regex which is apparently needed for look around (?<![0-9])

Here is example of original file and desired outputs:

original:

L&L logfile

14-5-12
16-05-2012
Experiment 1
Device 77212-123-123123
Instrument 2, 34g, 66hz
Notes:
Something weird happened 12:34
Everything is fine 13:07
Log
8:00 routine 1
8:20 routine 2
8:40 routine 3, 8:45 something went south
8:50 routine 4, 8:50:12 weird peak at data

output1:

14-5-12
16-05-2012
12:34
13:07
8:00
8:20
8:40
8:45
8:50
8:50:12

output2:

14-5-12
16-05-2012
Something weird happened 12:34
Everything is fine 13:07
8:00 routine 1
8:20 routine 2
8:40 routine 3, 8:45 something went south
8:40 routine 3, 8:45 something went south
8:50 routine 4, 8:50:12 weird peak at data
8:50 routine 4, 8:50:12 weird peak at data
  • 2
    Please edit your question, show us an example of your input file (including examples of each possible time stamp format) and your desired output. – terdon Jul 29 '16 at 8:02
  • Costas showed the simple grep, add e.g. -2 to get two adjacent lines too. Though repeats won't be done nicely with just grep. – ilkkachu Jul 29 '16 at 8:11
  • Assuming that your date and time regex is adequate, (check this out: stackoverflow.com/questions/15491894/… to make sure that yours is all-inclusive), then all you'd need to have a "few" surrounding words is something like (\w*\s){2} (preceding) or (\s\w*){2} (following). Lines would be something like (^.*\n.*){2} for 2 preceding lines and (.*\n.*){2} for 2 following lines, assuming the text has distinct new-line breaks and not just wrapped text. – Jim Jul 29 '16 at 8:24
0
grep -Eo '[0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?' text.file

will produce just time-stamps. By remove -o option you'll receive full lines

grep -E '[0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?' text.file

If pattern [0-9.]{10} will not produce correct output it can be easy to change for more strong ([0-9]{2}\.){2}[0-9]{4}
If you'd like to do both task simultaneously it can be done by sed e.g.

sed -r '/[0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?/w string.file
s/[^:]*([0-9.]{10},[0-9]{2}:[0-9]{2}(:[0-9]{2})?)/\1\n/;//P;D' text.file
  • I just can't get those sed commands work. Can you explain what is happening there. And those grep commands would be nice but if there is more than one time stamp per line, grep will print just once that line. – Lesenger Aug 1 '16 at 10:26
  • @Lesenger the problem can be in sed' version (viewable by sed --version) which don't have -r option. Do grep -Eo show all time stamps? – Costas Aug 1 '16 at 10:50
  • @Lesenger I see updated question and have to change regexp to grep -Ewo '([0-9]{1,2}-){2}([0-9]{1,2}){2}|[0-9]{1,2}(:[0-9]{2}){1,2}' – Costas Aug 1 '16 at 11:08
  • I got that sed command almost working. I didn't realize that it should be in two seperate lines. With command sed -r '/([0-9]{1,2}-){2}([0-9]{1,2}){2}|[0-9]{1,2}(:[0-9]{2}){1,2}/w outA s/[^:]*(([0-9]{1,2}-){2}([0-9]{1,2}){2}|[0-9]{1,2}(:[0-9]{2}){1,2})/\1\n/;//P;D' original right time stamps but when there is more than one time stamp in the line, command will not generate two identical lines in the output. Output is: Line 1: 8:40 routine 3, 8:45 something went south and Line 2: ` routine 3, 8:45 something went south`. This nevertheless is more than enough for my purposes. GNU sed 4.2.2 – Lesenger Aug 2 '16 at 6:30
  • and those grep commands would be fine if it would print line twice if there is two time stamps in the line. – Lesenger Aug 2 '16 at 6:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.