定義された距離に従ってSNPを遺伝子座にグループ化します。

定義された距離に従ってSNPを遺伝子座にグループ化します。

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変更しますGroup2Group3Group4

別のコマンドを試してみました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' - '/^$/' '{*}'

関連情報