CN_*_*133 4 awk pattern-matching
我有一个序列文件:
$猫文件 CACCGTTGCCAAACAATG TTAGAAGCCTGTCAGCCT CATTGCTCTCAGACCCAC GATGTACGTCACATTAGA ACACGGAATCTGCTTTTT CAGAATTCCCAAAGATGG
我想计算 C+T 的最长延伸。我只能计算总 C+T,但我想要最长的伸展。
$ cat 文件 | awk '{ 打印 $0, gsub(/[cCtT]/,"",$1)}' CACCGTTGCCAAACAATG 9 TTAGAAGCCTGTCAGCCT 10 CATTGCTCTCAGACCCAC 12 GATGTACGTCACATTAGA 8 ACACGGAATCTGCTTTTT 11 CAGAATTCCCAAAGATGG 7
该预期的结果将显示出最长的C ^ + T舒展。
CACCGTTGCCAAACAATG 9 2 TTAGAAGCCTGTCAGCCT 10 3 CATTGCTCTCAGACCCAC 12 5 GATGTACGTCACATTAGA 8 2 ACACGGAATCTGCTTTTT 11 6 CAGAATTCCCAAAGATGG 7 5
$ awk '{ split($0, a, "[^CTct]+"); m=0
for (i in a) {
len=length(a[i])
if (len > m) m=len
}
print $0, m }' file
CACCGTTGCCAAACAATG 2
TTAGAAGCCTGTCAGCCT 3
CATTGCTCTCAGACCCAC 5
GATGTACGTCACATTAGA 2
ACACGGAATCTGCTTTTT 6
CAGAATTCCCAAAGATGG 5
Run Code Online (Sandbox Code Playgroud)
该awk
程序在运行任何非大写或小写C
或T
. 然后,它循环遍历分割结果的比特,找到最长的比特。然后它会打印原始行以及找到的最大长度。
由于 Roman 查看了各种解决方案的时间安排,因此这里有一个更快的解决方案:
awk -F "[^CTct]+" '
m = 0
for (i = 1; i <= NF; ++i) {
len = length($i)
if (len > m) m = len
}
print m' file | paste file -
Run Code Online (Sandbox Code Playgroud)
它更快,因为它只分割线一次。第一个代码还尝试在空格上分割输入行。
使用它进行计时,mawk
在 500000 行上显示 0.79 秒。第一个解决方案对相同的数据使用 1.69 秒,这表明分割操作可能花费最多的时间。
FWIW 这是一种在 perl 中实现的方法,使用max
fromList::Util
$ perl -MList::Util=max -lpe '$_ .= " " . max 0, map length, /[CT]+/gi' file
CACCGTTGCCAAACAATG 2
TTAGAAGCCTGTCAGCCT 3
CATTGCTCTCAGACCCAC 5
GATGTACGTCACATTAGA 2
ACACGGAATCTGCTTTTT 6
CAGAATTCCCAAAGATGG 5
Run Code Online (Sandbox Code Playgroud)