LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 721|回复: 3

请教如何实现如下文本的过滤!急

[复制链接]
发表于 2005-4-11 14:18:31 | 显示全部楼层 |阅读模式
假设有如下文本:
sss   1200  2400  3600
vvv   200  300 400 500 600 300 200
vvv   200  300 400 500 600 300 200
sss   1250  2500   3150
vvv   250  300 400 500 600 300 200
vvv   250  300 400 500 600 300 200
vvv   250  300 400 500 600 300 200
vvv   250  300 400 500 600 300 200
sss   1600  4800  3600
vvv   200  300 400 500 600 300 200
vvv   200  300 400 500 600 300 200
...      ...    ...     ...    ...    ...   ...   ...
如果第一列为sss的行的数据列元素能被40整除,则输出该行及下面随后的vvv行,并将满足这一条件的数据文本存为文件file1;如果如果第一列为sss的行中数据列元素能被50整除,则输出该行及下面随后的vvv行,并将满足这一条件的数据文本存为文件file2。
对于上述文件的file1输出结果为:
sss   1200  2400  3600
vvv   200  300 400 500 600 300 200
vvv   200  300 400 500 600 300 200
sss   1600  4800  3600
vvv   200  300 400 500 600 300 200
vvv   200  300 400 500 600 300 200
file2输出结果为:
sss   1250  2500   3150
vvv   250  300 400 500 600 300 200
vvv   250  300 400 500 600 300 200
vvv   250  300 400 500 600 300 200
vvv   250  300 400 500 600 300 200
发表于 2005-4-15 01:38:02 | 显示全部楼层
瞎变一个

  1. rm file?
  2. cat file|awk '{gsub(/^sss.*/,"\n&");print}'|awk 'BEGIN{RS=ORS="\n"}{if($2%40==0)print $0>"file1";else print $0>"file2"}';sed -i '/^$/d' file?
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-15 17:19:21 | 显示全部楼层

这样做好像不妥!

上面的例子要求仅以SSS开头的行来控制,如果SSS开头的行的数据元素能被40整除,就输出以SSS开头的这一行及后面的vvv行,不管vvv行的数据是什么、有多少行,能不能被40整除。如果以SSS开头的行的数据元素能被50整除,就输出以SSS开头的这一行及后面的vvv行,不管vvv行的数据是多少行、是什么,能不能被50整除。
如果文件file为
sss 1200 2400 3600
vvv 217 317 417 517 617 317 217
vvv 206 306 406 506 606 306 206
sss 1250 2500 3150
vvv 251 301 401 501 601 301 201
vvv 251 311 411 511 611 311 201
vvv 252 301 451 503 609 321 276
vvv 253 303 481 502 644 314 298
sss 1600 4800 3600
vvv 355 246 111 511 211 311 207
vvv 355 246 111 511 211 311 207

以SSS开头的行能被40整除的其输出结果为:
sss 1200 2400 3600
vvv 217 317 417 517 617 317 217
vvv 206 306 406 506 606 306 206
sss 1600 4800 3600
vvv 355 246 111 511 211 311 207
vvv 355 246 111 511 211 311 207

以SSS开头的行能被50整除的其输出结果为:
sss 1250 2500 3150
vvv 251 301 401 501 601 301 201
vvv 251 311 411 511 611 311 201
vvv 252 301 451 503 609 321 276
vvv 253 303 481 502 644 314 298
回复 支持 反对

使用道具 举报

发表于 2005-4-16 10:35:49 | 显示全部楼层
DSL兄写的是对的,偶验证了一下,可以用,满足要求!佩服啊。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表