我的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放置在其他行中,同时保持了染色体数和链。
答案 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中的指南:
答案 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 +
$