免费注册 查看新帖 |

Chinaunix

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

[文本处理] 查找文件t.txt文件内容包含good的行,删除good所在行及其向上数5行和向下数5行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-31 16:24 |只看该作者 |倒序浏览
需求如下:查找文件t.txt文件内容包含good的行,删除good所在行及其向上数5行和向下数5行?

t.txt文件内容如下:

# cat t.txt
5882|3530
5883|3529
5884|3528
5885|3532
5886|3533
good
5887|3534
5888|3535
5889|3536


5891|3541
5892|3543
5893|3544
5894|3545
5895|3546
good
5896|3531
5897|3537
5898|3539
5899|3540
5900|3542


5901|3547
5902|3551
5903|3554
5904|3553
5905|3556
good
5906|3559
5907|3560
5908|3561
5909|3562
5910|3564

如何查找文件t.txt文件内容包含good的行,删除good所在行及其向上数5行和向下数5行?

目前,可以使用 # grep -A5 -B5 'good'  t.txt

但是,不知道如何实现删除?望各位指点一下。非常感谢!

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
2 [报告]
发表于 2013-12-31 16:36 |只看该作者
不够5行的怎么处理?

论坛徽章:
0
3 [报告]
发表于 2013-12-31 16:46 |只看该作者
不够5行的,就取5行之内的行数删除就成。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2013-12-31 17:00 |只看该作者
本帖最后由 MMMIX 于 2013-12-31 17:04 编辑

回复 1# vcdog


    两个 good 之间隔的行数小于 5 和小于 10 的情况怎么处理?

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
5 [报告]
发表于 2013-12-31 17:21 |只看该作者
本帖最后由 yestreenstars 于 2013-12-31 17:25 编辑

try:
  1. awk '/good/{if(n>5)for(i=0;i++<n-5;)print a[i];k=1;n=0;next}k{if(++n==5)k=n=0;next}{a[++n]=$0}END{if(!k)for(i=0;i++<n;)print a[i]}'
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2013-12-31 18:19 |只看该作者
本帖最后由 jason680 于 2013-12-31 18:22 编辑

回复 1# vcdog


$ awk -vS=5 '{c++;for(n=0;n++<S;)a[n]=a[n+1];a[S+1]=$0}/good/{c=-S}c>S{print a[1]}END{for(n=c;n--;)print a[S-n+1]}' t.txt


$ awk -vS=4 '{c++;for(n=0;n++<S;)a[n]=a[n+1];a[S+1]=$0}/good/{c=-S}c>S{print a[1]}END{for(n=c;n--;)print a[S-n+1]}' t.txt
5882|3530

5891|3541
5900|3542


5901|3547
5910|3564

论坛徽章:
0
7 [报告]
发表于 2013-12-31 18:24 |只看该作者
本帖最后由 tseesing 于 2013-12-31 20:54 编辑
  1. grep -n 'good' t.txt | cut -d: -f1 | awk '{
  2.     if (NR == FNR)
  3.     {
  4.         goodline[$0]=0
  5.     } else {
  6.         allline[FNR]=$0
  7.     }
  8.     } END {
  9.         all_len=FNR
  10.         all_st=1
  11.         all_end=0
  12.         j=0
  13.         for (j in goodline)
  14.         {
  15.             for (; all_st < (j - 5); ++all_st)
  16.             {
  17.                 print allline[all_st];
  18.             }
  19.             all_st = j + 6
  20.         }
  21.         for (; all_st <= all_len; ++all_st)
  22.        {
  23.            print allline[all_st]
  24.        }

  25.     } ' - t.txt
复制代码
有点烂,头有点晕。担待下。
shell 不是万能的,你们考虑过 shell 的感受么
怪异点的需求用高级语言实在

论坛徽章:
0
8 [报告]
发表于 2013-12-31 18:53 |只看该作者
sed好像可以。忘了

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
9 [报告]
发表于 2013-12-31 19:06 |只看该作者
回复 6# jason680
请用以下文本测试一下:
  1. 1
  2. good
  3. 1
  4. 2
  5. 3
  6. good
  7. 1
  8. 2
复制代码

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
10 [报告]
发表于 2013-12-31 19:20 |只看该作者
$ lines=`grep -n good  t.txt | awk -F: '{print $1}'`
$ for l in $lines; do eval echo {$((l-5<1?1:l-5))..$((l+5))}d; done | sed 's/ /\n/g' | sort -nu | sed -f - t.txt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP