免费注册 查看新帖 |

Chinaunix

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

[文本处理] 带分析的文本处理。多行同时处理,大家来看看 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-13 16:30 |只看该作者 |倒序浏览
2 6 9 2 3 8 5
9 3 9 9 5 4 0
2 6 9 5 6 9 2
4 2 6 3 7 2 8
8 3 6 1 2 1 2
9 7 0 1 3 9 1
1 0 0 4 6 1 4
2 1 2 6 0 3 5
8 3 7 9 5 3 7
5 8 4 7 9 9 0
6 2 3 9 5 5 3
5 1 6 3 9 5 5
6 1 1 8 0 5 3
1 1 8 1 4 7 0
8 5 3 2 2 3 0
4 8 5 5 6 0 5
5 7 0 0 3 9 5
2 9 9 9 3 3 5
8 7 6 6 3 5 8
3 4 6 2 1 1 5

我把258定义为A, 369定义为B, 147定义为C.
这样子就有9中组合(x为0-9)
A x x A, A x x B, A x x C, B x x A, B x x B, B x x C, C x x A, C x x B, C x x C


下面是我要分析出的结果(就分析第一位和第四位)
2 6 9 2 3 8 5    A A (这里是因为第一位和第四位是2XX2所以根据上面的定义就是AA)
9 3 9 9 5 4 0    B B
2 6 9 5 6 9 2    A A
4 2 6 3 7 2 8    C B
8 3 6 1 2 1 2    A C
9 7 0 1 3 9 1    B C
1 0 0 4 6 1 4    C C
2 1 2 6 0 3 5    A B
8 3 7 9 5 3 7    A B
5 8 4 7 9 9 0    A C   中,(这一行是第十行。在上面十行中只有BXXA,CXXA个组合没出现)只要有一个在下面四行中出现标志为“中”不出现标记为“不中”。(这里的BXXA在下面第三行中出现了)
6 2 3 9 5 5 3    B B  #
5 1 6 3 9 5 5    A B  #  
6 1 1 8 0 5 3    B A  # 这里的BA在上面十行中没出现过
1 1 8 1 4 7 0    C C  #  
8 5 3 2 2 3 0    A A
4 8 5 5 6 0 5    C A
5 7 0 0 3 9 5    A 0
2 9 9 9 3 3 5    A B
8 7 6 6 3 5 8    A B
3 4 6 2 1 1 5    B A

这个只要满十行就开始处理了。接下来的第十一,十二行到最后一行都要处理
这上面就涉及到了要同时分析十行的数据提取出来和下面的四行作对比。比较难弄呀

论坛徽章:
0
2 [报告]
发表于 2012-10-15 15:35 |只看该作者
shell是不是弄不了这样的呀。

论坛徽章:
0
3 [报告]
发表于 2012-10-15 15:50 |只看该作者
awk ' BEGIN{v[1]=v[4]=v[7]="A";v[2]=v[5]=v[8]="B";v[3]=v[6]=v[9]="C"}
  (NR<=10){ k=v[$1]" "v[$4];  G[k]; print $0 " " k; next}
    {k=v[$1]" "v[$4];}  
      (k in G){print $0" "k; next}
        {print $0" NotFound"}' ur

论坛徽章:
0
4 [报告]
发表于 2012-10-16 15:45 |只看该作者
本帖最后由 tyguaike 于 2012-10-16 16:31 编辑
hujysh 发表于 2012-10-15 15:50
awk ' BEGIN{v[1]=v[4]=v[7]="A";v[2]=v[5]=v[8]="B";v[3]=v[6]=v[9]="C"}
  (NR


BEGIN{v[1]=v[4]=v[7]="A";v[2]=v[5]=v[8]="B";v[3]=v[6]=v[9]="C";v[0]=0}
  (NR<=10){ k=v[$1]" "v[$4];  G[k]; print $0 " " k; next}
   {k=v[$1]" "v[$4];}  
      (k in G){print $0" "k; next}
       {print $0" "k" NotFound"}

你好,你这个不对,你这个是以前面10行的数据作为参考。我的要十是这样的。
我给加个行号上去说明
1      3 9 5 4 2 7 1
2      8 7 4 6 8 3 4
3     4 8 2 6 8 2 7
4     5 8 8 2 7 1 3
5     4 3 7 7 3 8 7
6     0 2 1 7 3 9 9
7     0 7 1 4 2 6 2
8     0 4 5 6 6 0 8
9     5 2 2 1 1 9 3
10   4 4 6 5 9 0 3   
11   6 0 0 1 4 9 9 在这一行的时候以1-10行作为参考(11,12,13,14都对比1-10行)。
12   7 7 4 7 7 6 1  在这一行的时候以2-11行作为参考(12,13,14,15都对比2-11行)
13   0 9 3 2 2 8 1 以此类推下面都是这样
14   1 0 2 2 3 6 4
15   3 1 3 2 7 4 1
16   0 7 7 3 8 2 7
17   0 7 6 7 7 1 2
18   1 6 3 8 4 7 0
19   2 1 2 0 4 3 3
20   5 7 6 0 1 1 9 在这里的时候 以10-19行作为参考对像(20,21,22都对比)
21   5 4 8 9 7 2 4 在这里的时候 以11-20行作为参考对像(20,21都对比)
22   1 2 6 3 8 8 9 在这里的时候 以12-21行作为参考对像(20对比)

论坛徽章:
0
5 [报告]
发表于 2012-10-17 09:44 |只看该作者
回复 4# tyguaike
  1. awk ' BEGIN{v[1]=v[4]=v[7]="A";v[2]=v[5]=v[8]="B";v[3]=v[6]=v[9]="C"; v[0]="X"}
  2.   (NR<=10){ k=v[$1]" "v[$4];  G[k]; SEQ[NR]=k; print $0 " " k; next}
  3.   {k=v[$1]" "v[$4]; SEQ[NR]=k; x=$0" "k;}  
  4.   (! (k in G) ){x=x" NotFound"}
  5.   {print x; delete G[ SEQ[NR-10] ]; G[k]; }' ur
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-10-17 15:11 |只看该作者
本帖最后由 tyguaike 于 2012-10-17 15:19 编辑
hujysh 发表于 2012-10-17 09:44
回复 4# tyguaike


我现在简单化一下。下面的是前面加了序号,方便解说

1   3 9 5 4 2 7 1 C A
2   8 7 4 6 8 3 4 B C
3   4 8 2 6 8 2 7 A C
4   5 8 8 2 7 1 3 B B
5   4 3 7 7 3 8 7 A A
6   0 2 1 7 3 9 9 X A
7   0 7 1 4 2 6 2 X A
8   0 4 5 6 6 0 8 X C
9   5 2 2 1 1 9 3 B A
10 4 4 6 5 9 0 3 A B
11 6 0 0 1 4 9 9 C A  在这一行的时候要我检查一下看CA在上面10行(第1到第10行)有没有出现。
12 7 7 4 7 7 6 1 A A   在这一行的时候我要检查一下AA 在上面的第2到第11行里有没有出现。
13 0 9 3 2 2 8 1 X B
14 1 0 2 2 3 6 4 A B
15 3 1 3 2 7 4 1 C B
16 0 7 7 3 8 2 7 X C
17 0 7 6 7 7 1 2 X A
18 1 6 3 8 4 7 0 A B
19 2 1 2 0 4 3 3 B X
20 5 7 6 0 1 1 9 B X
21 5 4 8 9 7 2 4 B C
22 1 2 6 3 8 8 9 A C
23 8 0 5 9 8 1 5 B C
24 5 5 9 2 9 0 0 B B
25 5 2 1 5 3 8 5 B B
26 9 3 8 9 0 6 5 C C
27 9 6 4 3 2 9 8 C C

******************
下面是你的代码
awk ' BEGIN{v[1]=v[4]=v[7]="A";v[2]=v[5]=v[8]="B";v[3]=v[6]=v[9]="C"; v[0]="X"}
  (NR<=10){ k=v[$1]" "v[$4];  G[k]; SEQ[NR]=k; print $0 " " k; next}
  {k=v[$1]" "v[$4]; SEQ[NR]=k; x=$0" "k;}  
  (! (k in G) ){x=x" NotFound"}                     
  {print x; delete G[ SEQ[NR-10] ]; G[k]; }' ur


(! (k in G) ){x=x" NotFound"}                     #这里的G这个数组里的代码都是第1到第10行的代码,而我的要求是这个G里的代码是会变化的。
NR>10的时候G的代码应该是等于NR-1到NR-9
上面的SEQ[NR]我不明白是作什么用。下面打印和比较(k in G)中都没有用到。


*********************************************************
这下面用一个更简单的安例:

只用当前行NR和上面两行NR-1,NR-2比较
A B
B C
B B
C C
A C
A A
A C

输出结果:
A B
B C
B B NotFound #上面两行是AB BC
C C NotFound #上面两行是BB BC
C C Found    # 上面两行是BB CC,这里出现了CC
A C NotFound  #上面两行是CC CC,没出现AC
A A NotFound  #上面两行是 CC AC
A C Found     #上面两行是AC AA,这里出现了一个AC

论坛徽章:
0
7 [报告]
发表于 2012-10-17 15:54 |只看该作者

  1. awk ' BEGIN{v[1]=v[4]=v[7]="A";v[2]=v[5]=v[8]="B";v[3]=v[6]=v[9]="C"; v[0]="X"}
  2.   {printf("%03d ",NR)}
  3.   (NR<=10){ k=v[$1]" "v[$4];  G[k]++; SEQ[NR]=k; print $0 " " k; next}
  4.   {k=v[$1]" "v[$4]; SEQ[NR]=k; x=$0" "k;}
  5.   (! (k in G) ){x=x" NotFound"}
  6.   {print x; if( --G[ SEQ[NR-10] ] <=0 ) delete G[ SEQ[NR-10] ]; G[k]++; }' ur
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-10-18 20:00 |只看该作者
好,谢谢了

论坛徽章:
0
9 [报告]
发表于 2012-10-18 20:26 |只看该作者
hujysh 发表于 2012-10-17 15:54


    awk ' BEGIN{v[1]=v[4]=v[7]="A";v[2]=v[5]=v[8]="B";v[3]=v[6]=v[9]="C"; v[0]="X"}
      {printf("%03d ",NR)}
      (NR<=10){ k=v[$1]" "v[$4];  G[k]++; SEQ[NR]=k; print $0 " " k; next}
      {k=v[$1]" "v[$4]; SEQ[NR]=k; x=$0" "k;}
      (! (k in G) ){x=x" NotFound"}
      {print x; if( --G[ SEQ[NR-10] ] <=0 ) delete G[ SEQ[NR-10] ]; G[k]++; }' ur

对是对了。但是我看得不明白,这里的G[k]我打印是没有字符的。
你能不能每行代码给说说呀。
还有AWK里怎么样打印出数组里的所有数据呀。在不知道下标的情况下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP