关键词Python | C++ | 组学数据 | 阵列 | 序列 | 可视化 | 量化 | 基因 | 质量 | DNA | RNA | 遗传变异 | 蛋白质 | 氨基酸 | 血红蛋白 | 模式匹配 | 文本 | 正则表达 | 概率 | 比对 | 距离 | 密码子 | 频率 | 数据库 | 原子 | 细胞
Copy awk '{if(NR%4==1){print ">" substr($1, 2)}else if(NR%4==2){print}}' FILE.fastq > FILE.fasta
awk '{if(NR%4==1){print ">" substr($1, 2)}else if(NR%4==2){print}}' FILE.fastq | fold > FILE.fasta
awk '{if(NR==1 && $0 ~ /^>/){print}else if (NR!=1 && $0 ~ /^>/){print "\n" $0}else {printf $0}} END {printf "\n"}' FILE.fasta > NEW_FILE.fasta
Copy awk '/^@EXISTING_NAME_REGEX/{print "@TARGET_NAME_" ++i; next}{print}' FILE.fastq > NEW_FILE.fastqv
Copy zcat FILE.tar.gz | head -nNO_READS > FILE.fastq
Copy awk "{{ if(NR%4==2) print length($1) }}" READS.fast q > LENGTHS.txt
Copy awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b= 0 a= 3 s= "/1" READS.fastq > R1.fastq
awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b= 0 a= 3 s= "/2" READS.fastq > R2.fastq
我们在下面的函数中使用上述方法。 这里我们传递一个字符串引用和间隔来计算所需长度的 k-mers。 然而,由于我们使用 u_int64_t,因此我们仅限于 32 聚体。 对于除此之外的任何内容,请尝试使用位集或布尔向量。
Copy u_int64_t substr_kmer_int(string &str, int start, int length)
{
u_int64_t val = 0;
for (size_t i = start; i < start + length; i++)
{
val = val << 2;
val += (str[i] >> 1 & 3);
}
return val;
}
Copy u_int64_t revComp(u_int64_t x, size_t sizeKmer)
{
u_int64_t res = x;
res = ((res >> 2 & 0x3333333333333333) | (res & 0x3333333333333333) << 2);
res = ((res >> 4 & 0x0F0F0F0F0F0F0F0F) | (res & 0x0F0F0F0F0F0F0F0F) << 4);
res = ((res >> 8 & 0x00FF00FF00FF00FF) | (res & 0x00FF00FF00FF00FF) << 8);
res = ((res >> 16 & 0x0000FFFF0000FFFF) | (res & 0x0000FFFF0000FFFF) << 16);
res = ((res >> 32 & 0x00000000FFFFFFFF) | (res & 0x00000000FFFFFFFF) << 32);
res = res ^ 0xAAAAAAAAAAAAAAAA;
return (res >> (2 * (32 - sizeKmer)));
}
我们可以扩展上述函数来获取序列的 K-mer 直方图,这在生物信息学分析中非常常用。在第一个函数中,我们获得给定 k 值的所有可能的 K-mer。这是为了通过仅更新查找表来使计算更快。
Copy unordered_map<int, double> kSizeMers(int size)
{
unordered_map<int, double> kmers;
for (u_int64_t i = 0; i < (int)pow(4, size); i++)
{
kmers[min(i, revComp(i, size))] = 0;
}
return kmers;
}
vector<double> getKmersProfile(string &line, int size, bool normalize, unordered_map<int, double> &KMERS)
{
double total = 0;
long len = 0;
u_int64_t val = 0;
unordered_map<int, double> kmers;
kmers.insert(KMERS.begin(), KMERS.end());
vector<double> stats(kmers.size(), 0);
for (int i = 0; i < (int)line.length(); i++)
{
if (!(line[i] == 'A' || line[i] == 'C' || line[i] == 'G' || line[i] == 'T'))
{
val = 0;
len = 0;
continue;
}
val = (val << 2);
val = val & (int)(pow(2, 2 * size) - 1);
val += (line[i] >> 1 & 3);
len++;
if (len == size)
{
// use val as the kmer for counting
len--;
kmers[min(val, revComp(val, size))]++;
total++;
}
}
int i = 0;
for (unordered_map<int, double>::iterator it = kmers.begin(); it != kmers.end(); ++it)
{
if (normalize)
{
stats[i] = it->second / max(1.0, total);
}
else
{
stats[i] = it->second;
}
i++;
}
return stats;
}