LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 923|回复: 6

关于awk,时间戳问题,数据文件处理

[复制链接]
发表于 2005-6-23 18:05:02 | 显示全部楼层 |阅读模式
能否将下面第三个字段中的时间转为时间戳形式
1;0;2005-05-23 14:21:15
2;0;2005-05-23 14:19:30
3;1;2005-05-23 14:20:18
4;1;2005-05-23 14:21:07
5;1;2005-05-23 14:21:25
。。。
有上万行,其它已省

转时间戳形式如下:
date +%s -d "2005-05-23 14:21:15"
输出结果:1116829275
在awk中调用shell命令时需用system,然而
system("date +%s -d \"2005-05-23 14:21:15\"")
输出结果为命令返回值0
发表于 2005-6-23 19:45:55 | 显示全部楼层
  1. $ cat myfile
  2. 1;0;2005-05-23 14:21:15
  3. 2;0;2005-05-23 14:19:30
  4. 3;1;2005-05-23 14:20:18
  5. 4;1;2005-05-23 14:21:07
  6. 5;1;2005-05-23 14:21:25
  7. $ for MYDATE in $(gawk -F\; '{ print $3 }' myfile ); do  date +%s -d $MYDATE; done
  8. 1116820800
  9. 1119550875
  10. 1116820800
  11. 1119550770
  12. 1116820800
  13. 1119550818
  14. 1116820800
  15. 1119550867
  16. 1116820800
  17. 1119550885
  18. $
复制代码

可以吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-23 21:42:31 | 显示全部楼层
原文本data1为:
0|1|2|2005-05-23|14:19:41|14:20:09
1|2005-05-23|14:19:27|14:20:09
1|2005-05-23|14:19:53|14:20:09
3|0|2005-05-23|14:19:44|14:20:10
希望转变后为:
data2:
0;1116829181
1;1116829167
1;1116829193
3;1116829184

0;2005-05-23 14:19:41的时间戳
1;2005-05-23 14:19:27的时间戳
1;2005-05-23 14:19:53的时间戳
3;2005-05-23 14:19:44的时间戳
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-23 21:50:36 | 显示全部楼层
awk -F"|" '{\
{if($1==0){str=$4\"  \"$5";"date +%s -d \"$str\""|getline stamp;print$1";"stamp}}\
{if($1==1){str=$2\"  \"$3";"date +%s -d \"$str\""|getline stamp;print$1";"stamp}}\
{if($1==3){str=$3\"  \"$4";"date +%s -d \"$str\""|getline stamp;print$1";"stamp}}\
}' data1>>data2

可是还是有点问题,麻烦★版☆主★ kiron 解答!
高手们请不吝赐教!
回复 支持 反对

使用道具 举报

发表于 2005-6-24 00:19:53 | 显示全部楼层
Post by kiron
  1. $ cat myfile
  2. 1;0;2005-05-23 14:21:15
  3. 2;0;2005-05-23 14:19:30
  4. 3;1;2005-05-23 14:20:18
  5. 4;1;2005-05-23 14:21:07
  6. 5;1;2005-05-23 14:21:25
  7. $ for MYDATE in $(gawk -F\; '{ print $3 }' myfile ); do  date +%s -d $MYDATE; done
  8. 1116820800
  9. 1119550875
  10. 1116820800
  11. 1119550770
  12. 1116820800
  13. 1119550818
  14. 1116820800
  15. 1119550867
  16. 1116820800
  17. 1119550885
  18. $
复制代码

可以吗?

用for不如用while read结构,因为for的varlist先要欲处理一段时间,影响效率吧!
回复 支持 反对

使用道具 举报

发表于 2005-6-24 13:32:21 | 显示全部楼层
Post by 寂寞烈火
用for不如用while read结构,因为for的varlist先要欲处理一段时间,影响效率吧!


我不知道for和while循环的效率,但是两者都是内建的,效率应该差不多.
不过用for时对变量列表的要进行预处理的话那倒真是对楼主上万行的文本处理有些影响了.
楼主就以此写过一个while/read的版本吧.
回复 支持 反对

使用道具 举报

发表于 2005-6-24 13:38:52 | 显示全部楼层
Post by cbwindboy
原文本data1为:
0|1|2|2005-05-23|14:19:41|14:20:09
1|2005-05-23|14:19:27|14:20:09
1|2005-05-23|14:19:53|14:20:09
3|0|2005-05-23|14:19:44|14:20:10
希望转变后为:
data2:
0;1116829181
1;1116829167
1;1116829193
3;1116829184

0;2005-05-23 14:19:41的时间戳
1;2005-05-23 14:19:27的时间戳
1;2005-05-23 14:19:53的时间戳
3;2005-05-23 14:19:44的时间戳


给你一个思路:
想办法把data1变成:
0;2005-05-23 14:19:41
1;2005-05-23 14:19:27
1;2005-05-23 14:19:53
3;2005-05-23 14:19:44
这样就容易处理了,把上面的文本再用我上面写的,或者你写一个while/read的脚本处理一下,就可以得到data2了.
关键是如何把data1变成上面的格式:
你的文本格式非常的好,用awk取出第一个字段和倒数第二个和第三个字段就能得到想要的格式了.

试试吧.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表