免费注册 查看新帖 |

Chinaunix

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

awk能否实现这些功能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-10 07:26 |只看该作者 |倒序浏览
1.能否实现在一个文件里查找符合特定字符串的一行,然后把其前面第5行和后面第5行之间的一段内容插入到另一个文件同样符合这个字符串的一行其前面第5行之前.(好绕口啊,不知道我说清楚了没有)
2.awk里可不可以用变量做文件名.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-08-10 07:58 |只看该作者

awk能否实现这些功能

1,取一定范围的数据用sed,awk,grep均可!
2,可以!
3,见置顶shell基础十二篇

论坛徽章:
0
3 [报告]
发表于 2005-08-10 11:55 |只看该作者

awk能否实现这些功能

一行其前面第5行之前
我试了一下发现awk可以,但是方法太繁琐,显示不出awk的优势,想问烈火有没有什么简便的方法可以实现,如果用sed我只知道一行一行的处理,他需要匹配之后在前几行插入,想请问该怎么办?
awk实现方法(想问有没有简单点的方法)
BEGIN{
        found = 0;
        ind=0;
        collected = 6;
        insert_point = -1;
        line_file1 = 0;
        string = ARGV[1];
        delete ARGV[1];
}
{if(NR == FNR && found == 0){
        if ($0 !~ string)
        {
                table[ind] = $0;
                ind = (ind+1)%11;
        }
        else
        {
                found = 1;
                table[ind] = $0;
                ind = (ind+1)%11;
                printf("%d %s\n",ind,$0);
        }
}
else if (NR == FNR && found == 1)
{
        if (collected < 11)
        {
                table[ind] = $0;
                ind = (ind+1)%11;
                collected++;       
        }
        line_file1 = NR;
}
else
{
        output[FNR-1] = $0;
        if ($0 ~ string)
        {
                insert_point = FNR;
                printf("insert point:%d\n",insert_point);
        }
}
}
END{
        if (found == 0)
        {
                print("not found in file1\n";
                exit;
        }
        if (insert_point == -1)
        {
                print("not found in file2\n";
                exit;
        }
        printf("%d %d\n",NR,line_file1);
        for (i = 0; i < NR - line_file1; i++)
        {
                if(i == insert_point - 6)       
                {
                        for(j = 0; j < collected; j++)
                        {
                                ind = (ind == 0? 10: ind-1);
                                printf("%s\n",table[ind]);
                        }
                }
                printf("%s\n",output);
        }
}

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2005-08-10 12:21 |只看该作者

awk能否实现这些功能

用grep试试
grep -A5 -B5 'pattern' file #搜索pattern的前5行到后5行

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2005-08-10 12:24 |只看该作者

awk能否实现这些功能

awk '{a[NR]=$0}
/pattern/{c++}
c{c++}
c==7{for (i=NR-10;i<=NR;i++) print a;exit} ' file

上下5行

论坛徽章:
0
6 [报告]
发表于 2005-08-10 19:37 |只看该作者

awk能否实现这些功能

谢谢各位的帮助.。有了各位的回复我就不怕白忙活了。
最近刚从网上邮购了一本《sed与awk》,发现以我得水平很难在短时间内看懂。看来想在工作中省点儿力气也不容易呀。

论坛徽章:
0
7 [报告]
发表于 2005-08-10 22:47 |只看该作者

awk能否实现这些功能

原帖由 "hgfa" 发表:
谢谢各位的帮助.。有了各位的回复我就不怕白忙活了。
最近刚从网上邮购了一本《sed与awk》,发现以我得水平很难在短时间内看懂。看来想在工作中省点儿力气也不容易呀。

那本书讲的很细,认真看完了功力一定会大涨。如果向快速入门的话,还是看看sed1line,遇到不懂的地方,去查查《sed与awk》,这样也挺好。

论坛徽章:
0
8 [报告]
发表于 2005-08-12 13:25 |只看该作者

awk能否实现这些功能

waker斑竹果然厉害,写的非常精简,那如果要把他放到另外一个文件匹配字符串前面五行的之前,那又有没有什么简便的写法呢
另外烈火兄,solaris下grep是不是没有-A -B的参数呢,我好像没能找到啊

论坛徽章:
0
9 [报告]
发表于 2005-08-12 13:57 |只看该作者

awk能否实现这些功能

[quote]原帖由 "waker"]......上下5行[/quote 发表:


如果刚好在文件头五行内或尾都会出现增加的空行。最好加多个判断,文件头就不用一定取五行了。

  1. awk '{a[NR]=$0;
  2.       if($0~/pattens/) {
  3.         if(NR-5 > 0) n=(NR-5); else n=1;
  4.         for(i=n; i<=NR; i++) print a[i];
  5.         ln=0;
  6.         while(getline && ln<5) {print; ln++;}
  7.       }}' filename
复制代码

论坛徽章:
0
10 [报告]
发表于 2005-08-12 14:49 |只看该作者

awk能否实现这些功能

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP