我有一个大文件,格式如下:
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的值将成为输出。
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 . -提前感谢,期待着积极的回应。
发布于 2015-10-09 21:36:38
我假设你想要最小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发布于 2015-10-09 21:38:53
使用此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]:应用于第4个字段最先出现的每一行b[i++]=$0:在这种情况下,请用这些lines填充数组b
{a[$4]=$3}会附加到每一行。用第三个字段填充数组field.END{...},完成后,存储处理完所有行时将执行的第三个occurenceprint的最后一个值。循环通过数组b.$0=b[i]设置a $0第三个字段应该是最后一个occurenceprint打印line
输出:
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发布于 2015-10-10 16:44:33
这可能适用于您(GNU sed和sort):
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按第四列对文件进行排序,但保留原始顺序。
一次读取两行,将第四列与单行匹配的行减少到一行,并保留最后一行中的第三列。
按第二列对上述过程的输出进行数字排序(仍然保留原始顺序)。
https://stackoverflow.com/questions/33038744
复制相似问题