【发布时间】:2019-03-04 06:28:08
【问题描述】:
我有一个应用程序,它生成的文件包含用逗号 (,) 分隔的各种数据行。
例如:
hostname,file_name,type,status,size(b),date,owner(user),owner(group)
server1,/var,dir,ACT_VER,29987,2007-12-03 15:52:43.000,root,root
server2,/DATA_File.out,file,ACT_VER,299076487,2008-10-15 05:12:23.000,marcos,root
server3,/opt,dir,29987,2009-05-03 00:13:23.000,user1,group1
server4,/var/tmp/xxz.zip,file,MOD_VER,400,2007-12-03 15:52:43.000,root,root
server1,/usr,dir,34299876,2006-12-03 15:52:43.000,root,root
server3,/local/home,dir,MOD_VER,400,2009-05-03 00:13:23.000,user2,group1
预期输出:
hostname,file_name,type,status,size(b),date,owner(user),owner(group)
server1,/var,dir,ACT_VER,29987,2007-12-03 15:52:43,root,root
server2,/DATA_File.out,file,ACT_VER,299076487,2008-10-15 05:12:23,marcos,root
server3,/opt,dir,,29987,2009-05-03 00:13:23,user1,group1
server4,/var/tmp/xxz.zip,file,MOD_VER,400,2007-12-03 15:52:43,root,root
server1,/usr,dir,,34299876,2006-12-03 15:52:43,root,root
server3,/local/home,dir,MOD_VER,400,2009-05-03 00:13:23,user2,group1
第一个查询:有时文件会丢失第 4 列 status 中的信息,可以是 ACT_VER、MOD_VER、TCH_VER 或 CRT_VER。我想在缺少status 的文件中添加一个额外的逗号(,)。
第二次查询:date 列中的数据在 `YYYY-MM-DD HH:MM:SS.MsMs (Ms=millisecond) 中。我想忽略毫秒。
我正在寻找 awk 中的一些东西(其他任何东西)来做这两者,这在处理中很轻,因为代码必须解析数百万行。
对于第一个查询,我尝试了这个(以及几个替代品),但没有奏效
cat file | awk -F, 'BEGIN {OFS=","}{if ($4 !~ /VER/) $4=",$4";}{print $0}'
我还没有开始处理第二个查询。
我也想知道,当*VER* 丢失时,我是否应该将整个文件放入数组中并处理第4 个元素以包含额外的逗号(,)并删除第6 个元素中的.000。
不确定哪一个进程占用最少。
我在 RHEL 6.7 操作系统上使用 shell 脚本
【问题讨论】:
-
显示您所显示输入的预期输出。
-
@anubhava 谢谢,我完全忘记了。我已经编辑了我的查询。
-
上次编辑有一些错误。我已经更正了。
-
@Marcos:您的输出仍然不正确
server4仍然有000在日期 -
@Inian 已更新。