我有一个已排序的ID和数字文件(位置)。我需要将第二列中的位置分组为500的间隔,然后分割成不同的文件。
输入
snp00001 200
snp00002 300
snp00003 400
snp00004 500
snp00005 600
snp00006 900
snp00007 1500
snp00008 1800
snp00009 3000
snp00010 3500
snp00011 4000
snp00012 5000期望输出
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然后将这些组保存到不同的文件中,分别重命名为Group1、Group2、Group3和Group4。
我尝试过bedtools和其他一些命令,但问题无法解决。
任何帮助都将不胜感激。
谢谢!
发布于 2022-04-11 09:44:20
对于awk来说,这是一个完美的工作:
$ 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若要打印成单独的文件,请执行以下操作:
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生成的文件,格式如下:
$ cat Group1
snp00001 200 Group1
snp00002 300 Group1
snp00003 400 Group1
snp00004 500 Group1
snp00005 600 Group1
$ cat Group6
snp00012 5000 Group6发布于 2022-04-15 10:26:08
使用Perl + csplit。范围运算符或触发器运算符“.”
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' - '/^$/' '{*}'https://unix.stackexchange.com/questions/698728
复制相似问题