+ -
当前位置:首页 → 问答吧 → shell求助

shell求助

时间:2011-04-08

来源:互联网

本帖最后由 north423 于 2011-04-08 12:56 编辑

两个文件A,B
A内容如下
  1. name1   date1
  2. name4   date2
  3. name1   date3
复制代码
B内容如下
  1. name1 2
  2. name2 1
  3. name3 1
复制代码
B中代表的意思是name1的个数为2,name2的个数为1,name3的个数为1


我想将A文件的内容合并到B,合并的结果是
  1. name1 3
  2. name4 1
复制代码
其中A中出现的name在B中增加一次(只增加一次),A中未出现,在B中出现就删除此name

不知道我描述清楚没

作者: north423   发布时间: 2011-04-08

awk -f test.awk  A B
-----------------test.awk--------------------
FNR=NR{
    array[$1] = 1
}
FNR!=NR{
   if ($1 in array)
      array[$1] = $2+1
   next
}
END{
   system("echo \"\"> B")
   for (i in array)
      i" "array[i] >B
}



}

作者: chenbin200818   发布时间: 2011-04-08

回复 chenbin200818
运算结果B为空?

作者: north423   发布时间: 2011-04-08

回复 north423
  1. awk 'NR==FNR{a[$1]=$2;}NR>FNR{b[$1]==1}END{for(i in b) print i,a[i]+1}' B A
复制代码

作者: yinyuemi   发布时间: 2011-04-08

回复 yinyuemi
3Q,

作者: north423   发布时间: 2011-04-08

回复 yinyuemi

如果B文件是空的,那么A中的name并不会被计算打印

作者: north423   发布时间: 2011-04-08

回复 north423


    没明白,举个例子?

作者: yinyuemi   发布时间: 2011-04-08

回复 yinyuemi
A文件还是例子的
B文件清空,没有内容,意味关于name的记录都没有

合并后的结果应该是
name1 1
name4 1

实际结果是空的,似乎NR>FNR这步执行不到

作者: north423   发布时间: 2011-04-08

回复 north423

try:
  1. awk 'FILENAME=="B"{a[$1]=$2;}FILENAME=="A"{b[$1]==1}END{for(i in b) print i,a[i]+1}' B A
  2. name1 1
  3. name4 1
复制代码

作者: yinyuemi   发布时间: 2011-04-08

回复 yinyuemi

加le检查就没问题,非常感谢

作者: north423   发布时间: 2011-04-08

回复 yinyuemi

如果用脚本执行这个命令,会出错
$1 $2会被识别为脚本的参数,这个该怎么解决?

作者: north423   发布时间: 2011-04-08

回复 north423
  1. cat awk.script
  2. FILENAME=="B"{a[$1]=$2;}
  3. FILENAME=="A"{b[$1]==1}
  4. END{for(i in b) print i,a[i]+1}

  5. awk -f awk.script B A
  6. name1 1
  7. name4 1
复制代码

作者: yinyuemi   发布时间: 2011-04-08