IDと数字(位置)を含むソートされたファイルがあります。 2番目の列の位置を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
が、問題は解決しません。
どんな助けでも大変感謝します。
ありがとうございます!
答え1
これは完璧な仕事です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
答え2
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' - '/^$/' '{*}'