首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINUX AWK命令用于合并基因的异构体

LINUX AWK命令用于合并基因的异构体
EN

Stack Overflow用户
提问于 2015-10-09 20:49:33
回答 3查看 137关注 0票数 0

我有一个大文件,格式如下:

代码语言:javascript
复制
chr1    11873   12227   DDX11L1 .   +
chr1    12612   12721   DDX11L1 .   +
chr1    13220   14409   DDX11L1 .   +
chr1    14361   14829   WASH7P  .   -
chr1    14969   15038   WASH7P  .   -
chr1    15795   15947   WASH7P  .   -
chr1    16606   16765   WASH7P  .   -
chr1    16857   17055   WASH7P  .   -
chr1    17232   17368   WASH7P  .   -
chr1    17368   17436   MIR6859-2   .   -
chr1    17368   17436   MIR6859-1   .   -
chr1    17605   17742   WASH7P  .   -
chr1    17914   18061   WASH7P  .   -
chr1    18267   18366   WASH7P  .   -
chr1    24737   24891   WASH7P  .   -
chr1    29320   29370   WASH7P  .   -
chr1    34610   35174   FAM138A .   -
chr1    34610   35174   FAM138F .   -
chr1    35276   35481   FAM138A .   -
chr1    35276   35481   FAM138F .   -
chr1    35720   36081   FAM138A .   -
chr1    35720   36081   FAM138F .   -
chr1    69090   69093   OR4F5   .   +
chr1    69090   70005   OR4F5   .   +
chr1    69090   70008   OR4F5   .   +
chr1    70005   70008   OR4F5   .   +
chr1    134772  139696  LOC729737   .   -
chr1    139789  139847  LOC729737   .   -

我想合并一个基因的所有异构体(列4)的坐标。如果列4中的值在列内相同,我希望第一个匹配行的列2中的值和最后一个匹配line.so中列3的值将成为输出。

代码语言:javascript
复制
chr1    11873   14409   DDX11L1 .   +
chr1    14361   29370   WASH7P  .   -
chr1    17368   17436   MIR6859-2   .   -
chr1    17368   17436   MIR6859-1   .   -
chr1    34610   36081   FAM138A .   -
chr1    34610   36081   FAM138F .   -
chr1    69090   70008   OR4F5   .   +
chr1    134772  139847  LOC729737   .   -

提前感谢,期待着积极的回应。

EN

回答 3

Stack Overflow用户

发布于 2015-10-09 21:36:38

我假设你想要最小col2和最大col3。

代码语言:javascript
复制
sort -k4 -k2n|
awk '$4!=p4{if(NR>1)print p1,min,max,p4,p5,p6;
            p1=$1;min=$2;max=$3;p4=$4;p5=$5;p6=$6;}
     $4=p4{if($3>max)max=$3}
     END{print p1,min,max,p4,p5,p6}'|
sort -k2n
票数 2
EN

Stack Overflow用户

发布于 2015-10-09 21:38:53

使用此awk

代码语言:javascript
复制
awk '!a[$4]{b[i++]=$0} {a[$4]=$3} END{for(i in b){$0=b[i];$3=a[$4];print}}' file

  • !a[$4]:应用于第4个字段最先出现的每一行
    • b[i++]=$0:在这种情况下,请用这些lines

填充数组b

  • {a[$4]=$3}会附加到每一行。用第三个字段填充数组field.
  • END{...},完成后,存储处理完所有行时将执行的第三个occurence
  • print的最后一个值。循环通过数组b.
  • $0=b[i]设置a $0第三个字段应该是最后一个occurence
  • print打印line

输出:

代码语言:javascript
复制
chr1 11873 14409 DDX11L1 . +
chr1 14361 29370 WASH7P . -
chr1 17368 17436 MIR6859-2 . -
chr1 17368 17436 MIR6859-1 . -
chr1 34610 36081 FAM138A . -
chr1 34610 36081 FAM138F . -
chr1 69090 70008 OR4F5 . +
chr1 134772 139847 LOC729737 . -

如果您希望将其列起来,请使用以下命令:

代码语言:javascript
复制
awk ... | column -t
票数 2
EN

Stack Overflow用户

发布于 2015-10-10 16:44:33

这可能适用于您(GNU sed和sort):

代码语言:javascript
复制
sort -sk4,4 file |
sed -r ':a;$!N;s/^((\S+\s+){2})\S+\s+(\S+)\s+.*\s+(\S+\s+\3)/\1\4/;ta;P;D'|
sort -sk2,2n

按第四列对文件进行排序,但保留原始顺序。

一次读取两行,将第四列与单行匹配的行减少到一行,并保留最后一行中的第三列。

按第二列对上述过程的输出进行数字排序(仍然保留原始顺序)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33038744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档