我正在寻找一种方法将4行dna探测结果合并为一行。
这里的问题是:
我不想追加这些台词。但关联他们
4行dna探测:
A----A----------A----A-A--AAAA-
-CC----CCCC-C-----CCC-C-------C
------G----G--G--G------G------
---TT--------T-T---------T-----
我需要这些是1行,不仅仅是附加,而是混合没有破折号。
结果的第一个字符:
ACCTTAGCCCCGC...
这似乎是一种一般问题,所以选择解决这个问题的语言并不重要。
答案 0 :(得分:2)
lines=(
A----A----------A----A-A--AAAA-
-CC----CCCC-C-----CCC-C-------C
------G----G--G--G------G------
---TT--------T-T---------T-----
)
result=""
for ((i=0;i<${#lines};i++)) ;do
chr=- c=()
for ((l=0;l<${#lines[@]};l++)) ;do
[ "${lines[l]:i:1}" != "-" ] &&
chr="${lines[l]:i:1}" &&
c+=($l)
done
[ ${#c[@]} -eq 0 ] && printf 'Char #%d not replaced.\n' $i
[ ${#c[@]} -gt 1 ] && c="${c[*]}" && chr="*" &&
printf "Conflict at char #%d (lines: %s).\n" $i "${c// /, }"
result+=$chr
done
echo $result
使用提供的输入,没有冲突,所有字符都被替换。所以输出是:
ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC
注意:有4个不同文件的问题,因此lines=
语法可能是:
lines=($(cat file1 file2 file3 file4))
但输入错误:
lines=(
A----A---A-----A-----A-A--AAAA-
-CC----CCCC-C-----CCC-C-------C
------G----G---G-G------G------
---TT--------T-T---------T-----
)
输出可能是:
Conflict at char #9 (lines: 0, 1).
Char #14 not replaced.
Conflict at char #15 (lines: 0, 2, 3).
Char #16 not replaced.
和
echo $result
ACCTTAGCC*CGCT-*-GCCCACAGTAAAAC
但是如果要验证输入,这个小的perl过滤器可以完成这项工作:
(感谢@ jm666 }{
语法)
perl -nlE 'y+-+\0+;$,|=$_}{say$,' <(cat file1 file2 file3 file4)
,其中
-n process all lines without output
-l whipe leading cariage return at end of lines
y+lhs+rhs+ replace (translate) chars from 'lhs' to 'rhs'
\0 is the *null* character, binary 0.
$, is a variable
|= binary or, between himself and current line ($_)
}{ at END, once all lines processed
答案 1 :(得分:1)
替代方式 - 效率不高 - 但简短:
file="./gene"
line1=$(head -1 "$file")
seq ${#line1} | xargs -n1 -I% cut -c% "$file" | paste -s - | tr -cd '[A-Z\n]'
打印:
ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC
假设:每条线的长度相同。
分解:
line1=$(head -1 "$file")
将第1行读入变量line1
seq ${#line1}
生成一系列数字1
.. char_count_in_the_line1
,如1
2
..
31
xargs -n1 -I% cut -c% "$file"
将针对cut
之类的命令cut -c22 filename
为每个上面的数字运行 - 从文件中提取给定的column
,例如您将获得如下输出:A
-
-
-
-
C
-
-
# and so on
paste -s -
会将上述行与\t
(标签)分隔符连接成一条长行,例如:A - - - - C - - - C - - - - - T ... etc...
tr -cd '[A-Z\n]'
删除了不是大写字符或换行符的所有内容,因此会得到最终的ACCTTAGCCCCGCTGTAGCCCACAGTAAAAC