Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3024879
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2012-09-12 11:27:00

保持第一列的scaffold的先后顺序不变,第二列在同一条scaffold的情况,按数字大小排序。
Ph_scaffold57_2 6002125
Ph_scaffold57_2 1826520
Ph_scaffold4    54818110
Ph_scaffold4    53507591
Ph_scaffold4    51550443
Ph_scaffold4    15513112
Ph_scaffold243  767655


结果是:
Ph_scaffold57_2 1826520
Ph_scaffold57_2 6002125
Ph_scaffold4    15513112
Ph_scaffold4    51550443
Ph_scaffold4    53507591
Ph_scaffold4    54818110
Ph_scaffold243  767655





  1. awk 'NR>1&&i!=$1{for(j=0;j++<asorti(a,b);)print i,b[j];delete a}{i=$1;a[$2]}' file <(echo)
[解析]
一开始我以为是个蛮小的问题, sort应该就可以解决, 不就是一个排序嘛. 后来发现sort无法在第一列相同且不改变先后顺序的情况下针对第二列排序, sort要么连第一列都排序了, 这样就打乱了原先的自然顺序. 
既然原先考虑的方法不行, 就只有用awk了, 思路是分别针对每个相同的第一列进行排序, 目的是为了不改变其自然顺序, 把相同第一列的第二列的值放入数组a中, 当发现第一列不相同时, 就排序输出, 清空数组a.





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

V_客2012-11-09 11:16:38

刚开始看到也认为用sort可以搞定, 自己还测试了一番 实在搞不定 也只能依靠awk了 :
awk 'NR==1{a=$1}$1!=a{l=asorti(b,c);for(i=1;i<=l;i++)print b[c];delete b;a=$1}{b[$2]=$0}END{print}' 比你写的麻烦好多