我有一个序列文件:
$猫文件 CACCGTTGCCAAACAATG TTAGAAGCCTGTCAGCCT CATTGCTCTCAGACCCAC GATGTACGTCACATTAGA ACACGGAATCTGCTTTTT CAGAATTCCCAAAGATGG
我想计算最长的 C+T 段。我只能计算总 C+T,但我想要最长的延伸。
$猫文件 | 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
FWIW 这是一种在 perl 中执行此操作的方法,使用
max
fromList::Util
该
awk
程序在运行任何不是大写或小写C
或T
. 然后它遍历分割结果的位,找到最长的位。然后它将原始行与找到的最大长度一起打印。由于 Roman 查看了各种解决方案的时间安排,因此这里有一个更快的解决方案:
它更快,因为它只分割线一次。第一个代码还尝试将输入行拆分为空格。
mawk
使用在 500000 行上显示 0.79 秒进行计时。第一个解决方案在相同的数据上使用了 1.69s,表明它可能是拆分操作花费的时间最多。更快的 GNU
awk
解决方案:输出:
时间性能对比(测试
inputfile
大概有120000行):使用
sed
(假设每行不超过 19 个字符),只是为了好玩并使用 RE 匹配的贪婪属性:@Kusalananda 解决方案的一个变体:
也试试
时间比其他
awk
提案快一点。