LINUX删除指定字段不匹配的行脚本怎么写

操作系统:SUSE11需求:有一文本文件,里面数据以|分隔,现在需求如果第8个字段不是时间格式(例:2014-11-2710:11:27),则删除此行。直接修改文件。我考... 操作系统:SUSE11

需求:有一文本文件,里面数据以|分隔,现在需求如果第8个字段不是时间格式(例:2014-11-27 10:11:27),则删除此行。直接修改文件。
我考虑用awk加sed写,但是写不出来,求高手帮忙!
请大家注意,我想要的是直接修改原文件,而不是把剔除结果重定向。请问有没有办法呢?
展开
 我来答
frams
2014-11-27 · TA获得超过781个赞
知道小有建树答主
回答量:228
采纳率:100%
帮助的人:241万
展开全部

用 sed 实现比较麻烦,可以用 awk:

 awk -F"|" '{if($8 ~ /[0-9]{4}-[0-9]{2}-[0-9]{2}\ [0-9]{2}:[0-9]{2}:[0-9]{2}/) {print}}' Input > Output

Input 是需要处理的文件, Output 是输出文件。awk 不提供直接修改文件的功能。[0-9]{4} 是正则表达式表示4个数字,其它类似。

追问
能直接修改文件吗?因为文件太大,重新输出一个比较浪费磁盘空间。
追答
如果怕占用空间,为什么不能输出结果后把原文件删了?直接修改很大的文件很费时间,不如直接输出。用 perl 貌似可以实现,比较麻烦,awk 和 sed 实现更麻烦
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yss624_
2014-11-27 · TA获得超过4.7万个赞
知道大有可为答主
回答量:9775
采纳率:77%
帮助的人:2567万
展开全部
awk -F"|" '{if($8~/.*-*-.*:.*:/) print}' 1.txt
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
eexpress
2014-11-27 · TA获得超过884个赞
知道大有可为答主
回答量:1493
采纳率:100%
帮助的人:773万
展开全部
这事awk足够了。perl大材小用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
睫毛轻扇
2014-12-17
知道答主
回答量:15
采纳率:0%
帮助的人:13.5万
展开全部
sed -i -r '/^([^|]*\|){7}[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/!d' filename
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liu515678087
2014-11-27 · 超过24用户采纳过TA的回答
知道答主
回答量:220
采纳率:50%
帮助的人:99.6万
展开全部
用perl写给你可以吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式