Подсчет символов в строках можно легко выполнить с помощью awk.Для этого вы используете функцию gsub
:
gsub(ere, repl[, in])
Ведите себя как sub
(см. Ниже), за исключением того, что она должна заменить все вхождениярегулярное выражение (например, глобальный заменитель утилиты ed) в $0
или в аргументе in
, если он указан.
sub(ere, repl[, in ])
Заменить строку repl
вместопервый экземпляр расширенного регулярного выражения ERE
в строке в и возвращаем количество подстановок . Если in
опущен, awk должен использовать вместо него текущую запись ($0
).
source: Awk Posix Standard
Следующие две функции выполняют подсчет следующим образом:
function countCharacters(str) {
while(str != "") { c=substr(str,1,1); a[toupper[c]]+=gsub(c,"",str) }
}
или если может появиться много одинаковых последовательных символов, следующее решение может сбритьвыключено на пару секунд.
function countCharacters2(str) {
n=length(str)
while(str != "") { c=substr(str,1,1); gsub(c"+","",str);
m=length(str); a[toupper[c]]+=n-m; n=m
}
}
Ниже вы найдете 4 реализации, основанные на первой функции.Первые два запускаются на стандартном awk, последние два - на оптимизированной версии для fasta-файлов:
1.Читайте последовательность и обрабатывает ее построчно:
awk '!/^>/{s=$0; while(s!="") { c=substr(s,1,1); a[c]+=gsub(c,"",s) } }
END {for(c in a) print c,a[c]}' file
2.объединить все последовательности и обработать их в конце:
awk '!/^>/{s=s $0 }
END {while(s!="") { c=substr(s,1,1); a[c]+=gsub(c,"",s) }
for(c in a) print c,a[c]}' file
3.То же, что 1, но используйте bioawk
:
bioawk -c fastx '{while ($seq!=""){ c=substr($seq,1,1);a[c]+=gsub(c,"",$seq) } }
END{ for(c in a) print c,a[c] }' file
4.То же, что 2, но используйте bioawk
:
bioawk -c fastx '{s=s $seq}
END { while(s!="") { c=substr(s,1,1); a[c]+=gsub(c,"",s) }
for(c in a) print c,a[c]}' file
Вот некоторые временные результаты, основанные на этом файле fasta
OP : grep,sort,uniq : 47.548 s
EdMorton 1 : awk : 39.992 s
EdMorton 2 : awk,sort,uniq : 53.965 s
kvantour 1 : awk : 18.661 s
kvantour 2 : awk : 9.309 s
kvantour 3 : bioawk : 1.838 s
kvantour 4 : bioawk : 1.838 s
karafka : awk : 38.139 s
stack0114106 1: perl : 22.754 s
stack0114106 2: perl : 13.648 s
stack0114106 3: perl (zdim) : 7.759 s
Примечание: BioAwk основан на awk Брайана Кернигана , который задокументирован в "Языке программирования AWK" Аль Ахо, Брайана Кернигана и ПитераВайнбергер (Addison-Wesley, 1988, ISBN 0-201-07981-X) .Я не уверен, что эта версия совместима с POSIX .