Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163305
  • 博文数量: 21
  • 博客积分: 2371
  • 博客等级: 大尉
  • 技术积分: 217
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-15 18:36
文章分类

全部博文(21)

文章存档

2010年(6)

2009年(15)

分类:

2010-05-07 00:34:20

文件old

段落1描述
1,a,b,c
2,d,e,a
3,2,j,x
段落2描述
1,x,j
2,j,b
4,k,d
段落3描述
oo,j,c
qq,d,q

文件new

段落1描述
1,dd1
3,qqq
9,lll
段落2描述
1,j
n,x
段落3描述
oo,11
bb,ab
xx,jj


1、文件new、old格式相同,每行都是以,分隔,都是分段落的数据,每段段落开始的行描述都固定(段落1、段落2...)

2、文件new固定是2个字段

3、各个段落的第一列有可能有重复,比如文件new段落1第一列有1,段落2也有

4、old文件每个段落各自的字段数都是相同的,如old文件段落1都是4个字段

数据处理要求:

1、针对相同的段落,以第1列为标准,将new中的第二列附加到old文件对应的行后面

2、对于某个段落第一列的某个值,如果old中有而new中无,则old中这一行后面附加null

3、对于某个段落第一列的某个值,如果old中无而new中有,则需增加new中这一行数据,并且在中间根据该段落字段数添加相应个数的null

结果应如下

段落1描述
1,a,b,c,dd1
2,d,e,a,null
3,2,j,x,qqq
9,null,null,null,lll
段落2描述
1,x,j,j
2,j,b,null
4,k,d,null
n,null,null,x
段落3描述
oo,j,c,11
qq,d,q,null
xx,null,null,jj
bb,null,null,ab


awk程序my.awk  (运行方法为 awk -f my.awk new old)

#!/bin/awk -f
BEGIN {
  FS=","
}

function prt_no() {
  for (i in new) {
    split(i,x,",")
    if (m==x[1]&&!(i in org)) {
      printf x[2]
      for (j=1;j<=count[m];j++) printf ",null"
       print ","new[i]}
    delete x
  }
}

{
  if (NR==FNR) {
    if (/段落1描述/||/段落2描述/||/段落3描述/) {
      n++
      next}
    new[n","$1]=$2}

  if (NR>FNR) {
    if (/段落1描述/||/段落2描述/||/段落3描述/) {
      prt_no()
      m++
      print
      next}
    org[m","$1]
    count[m]=NF-1
    if (m","$1 in new)
      print $0","new[m","$1]
    else print $0",null"
  }
}

END {
  prt_no()
}

思路为:利用二维数组存放new中的数据,读入old数据时将二维数组中对应数据附加,

其中二维中的第一维为变量n(根据段落描述行进行递增n++),第二维为$1

阅读(2353) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~