首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于定义距离的SNPs轨迹分组

基于定义距离的SNPs轨迹分组
EN

Unix & Linux用户
提问于 2022-04-11 08:11:35
回答 2查看 94关注 0票数 0

我有一个已排序的ID和数字文件(位置)。我需要将第二列中的位置分组为500的间隔,然后分割成不同的文件。

输入

代码语言:javascript
复制
snp00001    200
snp00002    300
snp00003    400
snp00004    500
snp00005    600
snp00006    900
snp00007    1500
snp00008    1800
snp00009    3000
snp00010    3500
snp00011    4000
snp00012    5000

期望输出

代码语言:javascript
复制
snp00001    200 Group1
snp00002    300 Group1
snp00003    400 Group1
snp00004    500 Group1
snp00005    600 Group1
snp00006    900 Group2
snp00007    1500    Group3
snp00008    1800    Group3
snp00009    3000    Group4
snp00010    3500    Group4
snp00011    4000    Group5
snp00012    5000    Group6

然后将这些组保存到不同的文件中,分别重命名为Group1Group2Group3Group4

我尝试过bedtools和其他一些命令,但问题无法解决。

任何帮助都将不胜感激。

谢谢!

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2022-04-11 09:44:20

对于awk来说,这是一个完美的工作:

代码语言:javascript
复制
$ awk -v step=500 -v OFS='\t' \
'{ 
    if(NR==1 || $2>limit){
        limit=$2+step
        group++
    } 
    file="Group"group; print $0,file 
}' input_file 
snp00001    200 Group1
snp00002    300 Group1
snp00003    400 Group1
snp00004    500 Group1
snp00005    600 Group1
snp00006    900 Group2
snp00007    1500    Group3
snp00008    1800    Group3
snp00009    3000    Group4
snp00010    3500    Group4
snp00011    4000    Group5
snp00012    5000    Group6

若要打印成单独的文件,请执行以下操作:

代码语言:javascript
复制
awk -v step=500 -v OFS='\t' \
'{ 
    if(NR==1 || $2>limit){
        limit=$2+step
        group++
    } 
    file="Group"group; print $0,file > file
}' input_file 

这将从示例数据中生成通过Group1通过Group5生成的文件,格式如下:

代码语言:javascript
复制
$ cat Group1 
snp00001    200 Group1
snp00002    300 Group1
snp00003    400 Group1
snp00004    500 Group1
snp00005    600 Group1

$ cat Group6
snp00012    5000    Group6
票数 0
EN

Unix & Linux用户

发布于 2022-04-15 10:26:08

使用Perl + csplit。范围运算符或触发器运算符“.”

代码语言:javascript
复制
perl \
  -lMconstant='LIM,500' \
  -sane \
'
  my $e = do{$a=$F[1];1;} ... $F[1]-$a>LIM;

  print(qq($_\tGroup$k)),next
    if $e !~ /E0/ || $eof;

  print(q());$k++;

  redo if !eof || !$eof++;

' -- -k=1 file |
csplit --suppress-matched \
  -sz -f 'Group' - '/^$/' '{*}'
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/698728

复制
相关文章

相似问题

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