中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 有条件删除行_用sed或gawk等 上一主题 | 下一主题
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『楼 主』:  有条件删除行_用sed或gawk等

有一文本文件,数据量很大,其中部分数据如下:
公司部,500000,2009-6-12,2011-5-30,正常
公司部,2000000,2009-5-8,2011-5-7,次级
个贷保宁,80000,2008-4-20,2008-1-20,损失
公司部,5000000,2009-1-22,2012-1-21,正常
公司部,40000,2000-5-19,2002-5-20,可疑
个贷保宁,0,2006-1-20,2008-1-20,损失
个贷保宁,0,2008-1-21,2008-1-20,关注
个贷保宁,150000,2008-10-30,2010-10-28,次级
个贷保宁,28000,2009-9-7,2010-9-6,关注
公司部,3000000,2009-6-8,2011-5-7,正常
要求用sed或gawk等能快速处理文件的命令处理:
1、以逗号为分隔符,将数据中第二列为0的行删除;
2、以逗号为分隔符,将数据中第二列数据大于50000,且末列为“正常”的行删除。

求大家相助。

2010-9-8 20:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 2 楼』:  

找个gawk的基础教程看看吧



2010-9-8 21:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hexiaolin
新手上路





积分 2
发帖 2
注册 2009-3-1
状态 离线
『第 3 楼』:  

在windows中用gawk
gawk -F, "{if($2==0||($2>50000&&$NF~/正常$/)) $0=\"\";print}" file
有个“缺点”:要删除的行会变成空行

2010-9-8 22:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  Re 3 楼

可以看看教程中关于next的用法



2010-9-9 09:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『第 5 楼』:  

版主,在哪儿可以下载更多的关于gawk的教程?我在网上找到的教程都是些粗略的说明,没有详细深入的介绍。麻烦你指点迷津。

2010-9-9 10:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 6 楼』:  

O'Reilly sed & awk 2nd Edition
http://bbs.chinaunix.net/viewthread.php?tid=1588614#pid11286082

awk文章收集
http://bbs.bathome.net/thread-3997-1-1.html



2010-9-9 14:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『第 7 楼』:  

这个应该可以:
gawk -F, "{if($2==0||($2>50000&&$NF~/正常$/)) next;print}" file


2010-9-14 00:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
DXSX
中级用户





积分 247
发帖 147
注册 2009-4-9
状态 离线
『第 8 楼』:  

cmd 批处理 for+if 搞定
@echo off
for /f "delims=, tokens=1,2,3,4,5" %%c in (xyz.txt) do (
if not %%d GTR 500000 (if not "%%g"=="正常" echo %%c,%%d,%%e,%%f,%%g )
)
[ Last edited by DXSX on 2010-9-14 at 11:40 ]

2010-9-14 11:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hgx126
初级用户





积分 100
发帖 80
注册 2008-9-12
状态 离线
『第 9 楼』:  

HAT版主,能否指点一下以下四个批处理的区别:
gawk -F, "{($NF==\"正常\");print}" file

gawk -F, "{($NF==/正常/);print}" file

gawk -F, "($NF==\"正常\"){print}" file

gawk -F, "($NF==/正常/){print}" file
P处理中:
一、第一个与第二个结果相同,说明/正常/与\"正常\"可能相同,为什么第四个没有输出结果?修改为 $NF~/正常/ 才正确?/正常/与\"正常\"是否真的相同?

二、第一、二个P处理中,$NF==\"正常\"是否是表示最末一项等于“正常”,为什么输出结果又不是?

三、"~"与"=="区别在哪里?有时候两个结果相同,有时间结果又不同?

四、以下两个批处理:
gawk -F, "$2=="0"{print}" file
gawk -F, "{if($2=="0") print}" file
结果为什么是相同的?而上述第一、二个P处理与第三个又结果却不相同?

问题有点多,麻烦了!
谢谢了。

[ Last edited by hgx126 on 2010-9-14 at 20:56 ]

2010-9-14 20:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 10 楼』:  Re 9 楼

/正常/一般是进行正则匹配的时候才这样写;\"正常\"是Windows里面的特殊写法,\是为了转义后面的",在UNIX里面不需要这么麻烦。

~用于正则匹配,==用比较是否相等。



2010-9-14 21:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: