免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11710 | 回复: 19
打印 上一主题 下一主题

如何用sed或awk实现匹配值行及上下多行的删除? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-02 01:38 |只看该作者 |倒序浏览
本帖最后由 chris_zhu 于 2010-03-02 01:45 编辑

假如文件urfile内容为:
# cat urfile
1. aaaaaaaa
2. bbbbbbbb
3. cccccccc
4. dddddddd
5. eeeeeeee
6. ffffffff
7. gggggggg
8. hhhhhhhh
9. iiiiiiii
10. jjjjjjjj
11.
12. 11111111
13. 22222222
14. 33333333
15. 44444444
16. 55555555
17. ffffffff
18. 66666666
19. 77777777
20. 88888888
21. 99999999

如何用sed或awk删除包含fffff的行,同时删除该匹配值的上面3行和下面2行?
得到如下输出结果:
1. aaaaaaaa
2. bbbbbbbb
9. iiiiiiii
10. jjjjjjjj
11.
12. 11111111
13. 22222222
20. 88888888
21. 99999999

sed '/fffff/{n;d}' urfile可以删除匹配值的下一行,多行删除要怎么改?删除匹配值上面多行该如何做呢

麻烦sed/awk高手指点下,谢谢先~

论坛徽章:
0
2 [报告]
发表于 2010-03-02 04:17 |只看该作者
发一个比较烦琐的awk
# cat test.txt
1. aaaaaaaa
2. bbbbbbbb
3. cccccccc
4. dddddddd
5. eeeeeeee
6. ffffffff
7. gggggggg
8. hhhhhhhh
9. iiiiiiii
10. jjjjjjjj
11.
12. 11111111
13. 22222222
14. 33333333
15. 44444444
16. 55555555
17. ffffffff
18. 66666666
19. 77777777
20. 88888888
21. 99999999

# arr=`more test.txt | awk '{array[NR]=$0};END{for(i=0;i<=NR;i++)if(array[i]~/ffffff/)print array[i-3]"\n"array[i-2]"\n"array[i-1]"\n"array[i]"\n"array[i+1]"\n"array[i+2]}'`
# cat test.txt | grep -v "$arr"
1. aaaaaaaa
2. bbbbbbbb
9. iiiiiiii
10. jjjjjjjj
11.
12. 11111111
13. 22222222
20. 88888888
21. 99999999

论坛徽章:
0
3 [报告]
发表于 2010-03-02 07:02 |只看该作者
grep -v "`grep  -A2 -B3 "ffffff"  ttt`" ttt


别想太复杂....

论坛徽章:
0
4 [报告]
发表于 2010-03-02 07:44 |只看该作者
学习了~呵呵

论坛徽章:
0
5 [报告]
发表于 2010-03-02 09:14 |只看该作者
grep -v "`grep  -A2 -B3 "ffffff"  ttt`" ttt


别想太复杂....
cxfcxf 发表于 2010-03-02 07:02



    这个会造成误删吧。。
其它地方跟以下行相同的行也将被删除。
14. 33333333
15. 44444444
16. 55555555
17. ffffffff
18. 66666666
19. 77777777

论坛徽章:
0
6 [报告]
发表于 2010-03-02 09:17 |只看该作者
回复 3# cxfcxf

这个好,我之前一直纠缠在grep -v -A2 -B3了,思路转换不够

谢谢各位了

论坛徽章:
0
7 [报告]
发表于 2010-03-02 09:28 |只看该作者
这个会造成误删吧。。
其它地方跟以下行相同的行也将被删除。
14. 33333333
15. 44444444
16 ...
wqfhenanxc 发表于 2010-03-02 09:14



我随便写一下 你把F换成定式 就可以了啊...
比如用正则和grep -e来写f

论坛徽章:
0
8 [报告]
发表于 2010-03-02 09:44 |只看该作者
回复 7# cxfcxf


wqfhenanxc@ubuntu:~$ cat test
abcd
efg
abcd
hij
abcd
hello
efg

比如现在要删除hello以及其前后两行,用下面的语句就会误删:

wqfhenanxc@ubuntu:~$ grep -vF "`grep -A1 -B1 hello test`" test
hij

请问如何防止?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
9 [报告]
发表于 2010-03-02 10:14 |只看该作者
回复 8# wqfhenanxc


    这种问题用grep不适合。建议用sed,awk等工具。

论坛徽章:
0
10 [报告]
发表于 2010-03-02 10:18 |只看该作者
哦 的确是我疏忽...而且想不出grep的解法....不重复到好用-v-


楼主 我补偿你...

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my @array = <DATA>;
  5. my ( $index ) = grep { $array[$_] =~ /hello/ } 0 .. $#array;
  6. my $f = $index - 1;
  7. my $b = $index + 1;

  8. delete @array[$f .. $b];
  9. print @array;



  10. __DATA__
  11. abcd
  12. efg
  13. abcd
  14. hij
  15. abcd
  16. hello
  17. efg
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP