Chinaunix首页 | 论坛 | 博客
  • 博客访问: 214294
  • 博文数量: 87
  • 博客积分: 192
  • 博客等级: 入伍新兵
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-14 07:44
文章分类

全部博文(87)

文章存档

2013年(1)

2012年(86)

分类:

2012-04-14 15:38:10

cat a
1010 a
2000 a
1020 b
1030 c
1080 c
1090 x

cat b
1000 a
1001 e
1090 x
1002 f
1200 c

如果两个文本中有相同的行,就不输出,按第二个字段共同特征的行就合并一起。
1000 a 1010 a 2000 a
1020 b
1030 c 1080 c 1200 c
1001 e
1002 f




  1. sort -k2 a b|sed ':a;N;/^\(.*\)\n\1$/d;s/\( .*\)\n\(.*\)\1$/\1 \2\1/;ta;P;D'
[解析]
肯定对这2个文件先排序吧,如果匹配到两行是一模一样的就 d 删除掉。然后继续执行替换,这时候肯定不是一模一样的情况了,去替换匹配第二列的特征是否一致,如果成功就替换掉了 \n ,然后 ta 跳转去命令行首,读取下一行,判断是否一样(肯定不会一样了),接着继续替换,当读取的下一行不匹配标签了,那么替换不会成功,ta 不会生效,就 P;D ,打印第一行,然后删除,并跳转去行首继续执行。直到 N 无下一行读取中止命令。




  1. awk '$0 in c{delete b[$2];next}{a[$2]=a[$2]?a[$2]" "$0:$0;b[$2]=$2;c[$0]}END{for(i=0;i++<asort(b);)print a[b[i]]}' a b
[解析]
用三个数组来实现,数组a来保存内容,数组b来实现排序,数组c来实现判断是否一样的行。
阅读(712) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~