日期:2014-05-16  浏览次数:20799 次

shell awk问题
tmp.awk文件是想通过读入日期(从数据文件的第二列读),算出它离今天差多少天。

Perl code

{
        cmd = "echo `date -d "$2" +%s`";
        cmd | getline st_date;

        print 15412.666666666666666666666667-st_date/86400,$2,cmd,$0;
}



这里的15412.7代表今日,st_date/86400代表换算的日。


数据文件userProf第二列为日期,格式是YYYYmmdd。分隔符是"\t"


3087346 20110714 6 0 291178
2124945 20110623 3 2160 0
3087348 20110614 12 800 27
3087349 20110614 12 533 435
2018782 20100108 3 123093 22932
2307700 20100621 12 63690 14279
2307701 20100621 12 4490 7485
2307703 20100624 3 956 5791
696971 20100918 3 0 0
2307706 20100705 3 3238 8862
3762180 20120122 12 0 0
2307707 20100621 12 2390 400
3762181 20120122 12 0 0
3762182 20120122 12 45 0
2223915 20110224 3 824 1

执行命令


 
Assembly code
awk -f tmp.awk userProf


结果显示

244 20110714 echo `date -d 20110714 +%s` 3087346 20110714 6 0 291178
265 20110623 echo `date -d 20110623 +%s` 2124945 20110623 3 2160 0
274 20110614 echo `date -d 20110614 +%s` 3087348 20110614 12 800 27
274 20110614 echo `date -d 20110614 +%s` 3087349 20110614 12 533 435
796 20100108 echo `date -d 20100108 +%s` 2018782 20100108 3 123093 22932
632 20100621 echo `date -d 20100621 +%s` 2307700 20100621 12 63690 14279
632 20100621 echo `date -d 20100621 +%s` 2307701 20100621 12 4490 7485
629 20100624 echo `date -d 20100624 +%s` 2307703 20100624 3 956 5791
543 20100918 echo `date -d 20100918 +%s` 696971 20100918 3 0 0
618 20100705 echo `date -d 20100705 +%s` 2307706 20100705 3 3238 8862
52 20120122 echo `date -d 20120122 +%s` 3762180 20120122 12 0 0
52 20100621 echo `date -d 20100621 +%s` 2307707 20100621 12 2390 400
52 20120122 echo `date -d 20120122 +%s` 3762181 20120122 12 0 0
52 20120122 echo `date -d 20120122 +%s` 3762182 20120122 12 45 0
384 20110224 echo `date -d 20110224 +%s` 2223915 20110224 3 824 1


倒数第四行的结果明显是不对的,20100621到现在不可能是52天的。。。这个到底是什么原因呢?

------解决方案--------------------
cmd 是不是可以直接这样写?
cmd = "date -d "$2" +%s";
------解决方案--------------------
C# code

{
        cmd = "echo `date -d "$2" +%s`";
        cmd | getline st_date;

        print 15412.666666666666666666666667-st_date/86400,$2,cmd,$0;close(cmd)
}