1

I have a file in the following format:

"2004-04-19 12:25:57" 44 44
"2004-04-19 13:39:32" 36 36
"2004-04-19 14:00:53" 34 34

I need 2 new files:

a) A file which will replace "time" values of the first column of my file with numbers starting from 1, like this:

1 44 44
2 36 36
3 34 34

b) Another file which will replace "time" values of the first column of file with numbers unix tamestamp data, like this:

1082377557 44 44
1082381972 36 36
1082383253 34 34

4 Answers 4

4

You can use this bash one liner :

i=1; while IFS=' ' read a b c; do echo "$i $c" >>foo.txt; ((i+=1)); \
     echo "$(date -d "${a#\"} ${b%\"}" '+%s')" "$c" >>bar.txt; done <file.txt

Expanded form :

i=1
while IFS=' ' read a b c; do 
    echo "$i $c" >>foo.txt
    ((i+=1))
    echo "$(date -d "${a#\"} ${b%\"}" '+%s')" "$c" >>bar.txt
done <file.txt

After the operation foo.txt will have :

1 44 44
2 36 36
3 34 34

and bar.txt will have :

1082377557 44 44
1082381972 36 36
1082383253 34 34
4
  • foo.txt was created right, but bar.txt isn't getting filled with anything, instead i get following output at shell....................................................... -bash: echo: command not found usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] -bash: echo: command not found usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format] -bash: echo: command not found ... Commented Sep 4, 2015 at 0:36
  • @Haos I have tested this in my Ubuntu 14.04..works fine..what OS are you using ? what does type -a echo say ? Commented Sep 4, 2015 at 0:40
  • echo is a shell builtin echo is /bin/echo echo is /bin/echo Commented Sep 4, 2015 at 1:29
  • it seems there is a problem with date command in Mac Commented Sep 4, 2015 at 1:30
1

awk:

awk '{
    # store the time value (first 2 words)
    timestamp = $1 " " $2

    # shift the other fields 2 places (I wish this was simpler in awk)
    for (i=3; i<=NF; i++) $(i-2) = $i
    NF -= 2

    # print to the line-numbers file
    print NR, $0  > "file1"

    # convert the timestamp and print to that file
    gsub(/[-:"]/, " ", timestamp)
    print mktime(timestamp), $0   > "file2"
}' file

mktime requires GNU awk (I think).

perl:

perl -MTime::Piece -anE '
    BEGIN {
        $, = " "; 
        open $f1, ">", "file1"; 
        open $f2, ">", "file2"
    } 
    $date = shift @F; 
    $time = shift @F; 
    say $f1 $., @F; 
    say $f2 Time::Piece->strptime("$date $time", "\"%Y-%m-%d %H:%M:%S\"")->epoch, @F
' file
0
0

Well at the risk of doing your homework for you. Here you are.

Assuming your data is in a file named YOURFILENAME this first oneliner with add the line numbers and the two last fields from the file

count=1;cut -d" " -f 3,4 YOURFILENAME| while read line ; do echo $count $line;((++count)); done

This second one-liner will convert your dates to epochs and print out the rest of the line (had to add one more sed to get rid of the quote marks but I did this quick and dirty)

cut -d"\"" -f2 YOURFILENAME| while read line; do SWAP=$(date -d "$line" +\%s); sed -i "s/$line/$SWAP/g" YOURFILENAME;done ; sed 's/"//g' YOURFILENAME

Please realize that this is just one way that you can do this. There are probably quite a few more.

0

I'd do it like this in perl:

#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;

#open our files for output
open( my $output1, '>', "output_file_one.txt" ) or die $!;
open( my $output2, '>', "output_file_two.txt" ) or die $!;

#iterate the magic filehandle - <> - which reads either data piped from
#stdin, or opens files specified on command line. (Just like grep/awk/sed)
while (<>) {

    #regex match the values out of your source file.
    my ( $t, @values ) = m/^\"(.*)\" (\d+) (\d+)/;

    #convert $t into a time object.
    $t = Time::Piece->strptime( $t, "%Y-%m-%d %H:%M:%S" );

    #use the "epoch" method to extract the numeric time from $t
    print {$output1} join( " ", $t->epoch, @values );

    # $. is the perl special var for current line number.
    print {$output2} join( " ", $., @values );
}

close($output1);
close($output2);

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.