我发觉我可能有一年没有写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
-
#!/usr/bin/awk -f
-
-
NR==FNR{
-
a[NR]=$2;b[NR]=$3;c[NR]=$0;
-
next;
-
}
-
-
{
-
for(i=1;i<=length(a);i++){
-
if($2>=a[i] && $3<=b[i]){
-
if(d[c[i]]<$4){
-
e[c[i]]=c[i]" "$0;
-
d[c[i]]=$4;
-
}else{
-
e[c[i]]=e[c[i]] RS c[i]" "$0;
-
}
-
}
-
}
-
}
-
-
END{for(j in e)print e[j]}
[解析]
在文件A中, 用三个数组保存内容, 然后执行流程进入B文件, 在第9行用一个for循环遍历我们通过数组保存的A文件的内容, 然后开始每行判断. 在第10行对在跨度中的数据满足条件的进行操作, 这里需要取最大值的行, 所以用一个数组d来保存最大值. 最后打印.
阅读(3580) | 评论(1) | 转发(2) |