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

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

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2013-05-15 16:35:07

我发觉我可能有一年没有写awk实例运用了, 我自己都快忘了. 子曰温故而知新. 进入正题.

有两个文件
$ cat a
chr1    990400  990475
chr1    991000  991075

$ cat b
chr1    990400  990425  1.2
chr1    990425  990450  2.5
chr1    990450  990475  2.5
chr1    990475  990500  4.08
chr1    990500  990525  4.08
chr1    991000  991025  12
chr1    990025  991050  13
chr1    990050  991075  12

想在A文件中第二三列跨度间的数字在B文件中查询,
如chr1    990400  990475 在B中对应的位置内的有:
chr1    990400  990425  1.2
chr1    990425  990450  2.5
chr1    990450  990475  2.5

选取其中第三列最大的行, 如:
chr1    990425  990450  2.5 
chr1    990450  990475  2.5

加到原来行的右边, 打印新的内容:
chr1    990400  990475 chr1    990425  990450  2.5
chr1    990400  990475 chr1    990450  990475  2.5
chr1    991000  991075 chr1    990025  991050  13




  1. #!/usr/bin/awk -f

  2. NR==FNR{
  3.     a[NR]=$2;b[NR]=$3;c[NR]=$0;
  4.     next;
  5. }

  6. {
  7.     for(i=1;i<=length(a);i++){
  8.         if($2>=a[i] && $3<=b[i]){
  9.             if(d[c[i]]<$4){
  10.                 e[c[i]]=c[i]" "$0;
  11.                 d[c[i]]=$4;
  12.             }else{
  13.                 e[c[i]]=e[c[i]] RS c[i]" "$0;
  14.             }
  15.         }
  16.     }
  17. }

  18. END{for(j in e)print e[j]}

[解析]
        在文件A中, 用三个数组保存内容, 然后执行流程进入B文件, 在第9行用一个for循环遍历我们通过数组保存的A文件的内容, 然后开始每行判断. 在第10行对在跨度中的数据满足条件的进行操作, 这里需要取最大值的行, 所以用一个数组d来保存最大值. 最后打印.



阅读(3516) | 评论(1) | 转发(2) |
1

上一篇:udp流检测统计

下一篇:iptables 指令语法

给主人留下些什么吧!~~

ll1045672016-07-23 10:18:09

awk \'NR==FNR{a[NR]=$2;b[NR]=$3;c[NR]=$0;d++}NR!=FNR{for(i=1;i<=d;i++){if($2>=a[i]&&$3<=b[i]){print $0}}}\' file1 file2
chr1    990400  990425  1.2
chr1    990425  990450  2.5
chr1    990450  990475  2.5
chr1    991000  991025  12
这样可以么- -