LINUX AWK命令合并基因的同种型

时间:2015-10-09 12:49:33

标签: linux awk sed

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

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   .   -

我想合并基因的所有同种型(coloumn 4)的坐标。 如果第四列中的值在列中是相同的,我希望第一个匹配行的第2列中的值和最后一个匹配行中第3列的值。因此输出将变为。

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   .   -

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

使用此awk

awk '!a[$4]{b[i++]=$0} {a[$4]=$3} END{for(i in b){$0=b[i];$3=a[$4];print}}' file
  • !a[$4]:适用于第一个字段首先出现的每一行
    • b[i++]=$0:在这种情况下,请使用这些行填充数组b
  • {a[$4]=$3}适用于每一行。数组a填充了第3个字段,完成后会存储第3个字段的最后一个值。
  • 处理完所有行后,将执行
  • END{...}
    • for(i in b)循环通过数组b
    • $0=b[i]设置$0变量
    • $3=a[$4]第3个字段应该是最后一次出现
    • print打印

输出:

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 . -

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

awk ... | column -t