用poliregion修改BED

时间:2019-03-15 13:44:31

标签: r bash awk

我的BED文件格式有些棘手,我应该将其转换为经典的BED格式,以便可以将其正确地用于后续步骤:

我有这种非常规的BED格式:

1   12349   12398   +
1   23523   23578   -
1   23550;23570;23590   23640;23689;23652   +
1   43533   43569   +
1   56021;56078   56099;56155   +

说这些多个位置行代表了非编码碎片区域。

我想得到的是一个规范的BED文件,例如:

1   12349   12398   +
1   23523   23578   -
1   23550   23640   +
1   23570   23689   +
1   23590   23652   +
1   43533   43569   +
1   56021   56099   +
1   56078   56155   +

其中将混合在一起的poliregions放置在其他行中,同时保持了染色体数和链。

4 个答案:

答案 0 :(得分:1)

请您尝试以下。

awk '
{
  num=split($2,array1,";")
  num1=split($3,array2,";")
}
num>1 || num1>1{
  for(i=1;i<=num;i++){
     print $1,array1[i],array2[i],$NF
  }
  next
}
1'  Input_file | column -t

输出如下。

1  12349  12398  +
1  23523  23578  -
1  23550  23640  +
1  23570  23689  +
1  23590  23652  +
1  43533  43569  +
1  56021  56099  +
1  56078  56155  +

答案 1 :(得分:0)

#!/usr/bin/env bash
#              ^^^^-- NOT /bin/sh

while read -r a b c d; do
  if [[ $b = *';'* ]]; then         # if b contains any ';'s
    IFS=';' read -r -a ba <<<"$b"   # read string b into array ba
    IFS=';' read -r -a ca <<<"$c"   # read string c into array ca
    for idx in "${!ba[@]}"; do      # iterate over the indices of array ba
      # print a and d with the values for a given index for both ba and ca
      printf '%s\t%s\t%s\t%s\n' "$a" "${ba[idx]}" "${ca[idx]}" "$d"
    done
  else
    printf '%s\t%s\t%s\t%s\n' "$a" "$b" "$c" "$d"
  fi
done

这结合了现有StackOverflow问题的答案:

...以及BashFAQ中的指南:

请参见https://ideone.com/wmrXPE

答案 2 :(得分:0)

$ cat tst.awk
BEGIN { FS="[[:space:];]+" }
{
    n = (NF - 2) / 2
    for (i=1; i<=n; i++) {
        print $1, $(i+1), $(i+n), $NF
    }
}

$ awk -f tst.awk file
1 12349 12349 +
1 23523 23523 -
1 23550 23590 +
1 23570 23640 +
1 23590 23689 +
1 43533 43533 +
1 56021 56078 +
1 56078 56099 +

答案 3 :(得分:0)

尝试Perl解决方案

 perl -lane ' if( /;/ and /(\S{2,})\s+(\S{2,})/ ) { 
    $i=0;@x=split(";",$1);@y=split(";",$2); while($i++<scalar(@x)) 
     { print join(" ",$F[0],$x[$i-1],$y[$i-1],$F[-1]) }} else { print } ' emilio.txt| column -t

具有给定的输入

$ cat emilio.txt
1   12349   12398   +
1   23523   23578   -
1   23550;23570;23590   23640;23689;23652   +
1   43533   43569   +
1   56021;56078   56099;56155   +

$ perl -lane ' if( /;/ and /(\S{2,})\s+(\S{2,})/ ) { 
  $i=0;@x=split(";",$1);@y=split(";",$2); while($i++<scalar(@x)) 
   { print join(" ",$F[0],$x[$i-1],$y[$i-1],$F[-1]) }} else { print } ' emilio.txt| column -t
1  12349  12398  +
1  23523  23578  -
1  23550  23640  +
1  23570  23689  +
1  23590  23652  +
1  43533  43569  +
1  56021  56099  +
1  56078  56155  +

$