中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-04 23:42
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 有条件删除行_用sed或gawk等 查看 1,341 回复 9
楼 主 有条件删除行_用sed或gawk等 发表于 2010-09-08 20:34 ·  中国 四川 南充 电信
初级用户
★★
积分 100
发帖 80
注册 2008-09-12 15:08
17年会员
UID 125478
性别 男
状态 离线
有一文本文件,数据量很大,其中部分数据如下:

公司部,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,且末列为“正常”的行删除。

求大家相助。
2 发表于 2010-09-08 21:36 ·  中国 重庆 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
找个gawk的基础教程看看吧
3 发表于 2010-09-08 22:31 ·  中国 黑龙江 牡丹江 电信
新手上路
积分 2
发帖 2
注册 2009-03-01 02:02
17年会员
UID 140245
性别 男
状态 离线
在windows中用gawk

gawk -F, "{if($2==0||($2>50000&&$NF~/正常$/)) $0=\"\";print}" file


有个“缺点”:要删除的行会变成空行
4 Re 3 楼 发表于 2010-09-09 09:53 ·  中国 上海 联通
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
可以看看教程中关于next的用法
5 发表于 2010-09-09 10:43 ·  中国 四川 南充 阆中市 电信
初级用户
★★
积分 100
发帖 80
注册 2008-09-12 15:08
17年会员
UID 125478
性别 男
状态 离线
版主,在哪儿可以下载更多的关于gawk的教程?我在网上找到的教程都是些粗略的说明,没有详细深入的介绍。麻烦你指点迷津。
6 发表于 2010-09-09 14:37 ·  中国 上海 联通
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
7 发表于 2010-09-14 00:33 ·  中国 四川 南充 电信
初级用户
★★
积分 100
发帖 80
注册 2008-09-12 15:08
17年会员
UID 125478
性别 男
状态 离线
这个应该可以:
gawk -F, "{if($2==0||($2>50000&&$NF~/正常$/)) next;print}" file
8 发表于 2010-09-14 11:38 ·  中国 辽宁 葫芦岛 联通
中级用户
★★
积分 247
发帖 147
注册 2009-04-09 20:52
17年会员
UID 142531
性别 男
状态 离线
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 ]
9 发表于 2010-09-14 20:39 ·  中国 四川 南充 电信
初级用户
★★
积分 100
发帖 80
注册 2008-09-12 15:08
17年会员
UID 125478
性别 男
状态 离线
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 ]
10 Re 9 楼 发表于 2010-09-14 21:43 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
/正常/一般是进行正则匹配的时候才这样写;\"正常\"是Windows里面的特殊写法,\是为了转义后面的",在UNIX里面不需要这么麻烦。

~用于正则匹配,==用比较是否相等。
论坛跳转: