Board logo

标题: 有条件删除行_用sed或gawk等 [打印本页]

作者: hgx126     时间: 2010-9-8 20:34    标题: 有条件删除行_用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,且末列为“正常”的行删除。

求大家相助。
作者: HAT     时间: 2010-9-8 21:36
找个gawk的基础教程看看吧
作者: hexiaolin     时间: 2010-9-8 22:31
在windows中用gawk
gawk -F, "{if($2==0||($2>50000&&$NF~/正常$/)) $0=\"\";print}" file
有个“缺点”:要删除的行会变成空行
作者: HAT     时间: 2010-9-9 09:53    标题: Re 3 楼

可以看看教程中关于next的用法
作者: hgx126     时间: 2010-9-9 10:43
版主,在哪儿可以下载更多的关于gawk的教程?我在网上找到的教程都是些粗略的说明,没有详细深入的介绍。麻烦你指点迷津。
作者: HAT     时间: 2010-9-9 14:37
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
作者: hgx126     时间: 2010-9-14 00:33
这个应该可以:
gawk -F, "{if($2==0||($2>50000&&$NF~/正常$/)) next;print}" file

作者: DXSX     时间: 2010-9-14 11:38
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 ]
作者: hgx126     时间: 2010-9-14 20:39
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 ]
作者: HAT     时间: 2010-9-14 21:43    标题: Re 9 楼

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

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