我有一个包含行分隔文本的文件:
GCAACACGGTGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCCTAGTCCATCAGCAAATGCCGTTTCCAGCAATGCAAAGAGAACGGGAAGGTATCAGTTCACCG
GTGACTGCCATTACTGTGGACAAAAAGGGCACATGAAGAGAGACTGTGACAAGCTAAAGGCAGATGTAGC从这里,我想提取字符10到80,所以:
TGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCCT我发现了如何计算文件中的字符:
wc -m file以及如何获取每行字符数:
awk '{print substr($0,2,6)}' file但是我想不出一种方法来获得10到80的角色。
新行不算作字符。
有什么想法吗?
是的,这是DNA,来自全基因组。我从包含不同脚手架的fasta文件中提取了这段DNA (在本例中是10和11 )。
awk '/scaffold_10\>/{p=1;next} /scaffold_11/{p=0;exit} p'最后,我希望有一个简单的命令从指定的支架中获取字符100到800 (或类似的字符)。
编辑:问题继续在这里:使用gff2而不是bash脚本从全基因组中提取部分DNA序列.
发布于 2017-04-06 13:59:06
对于字节(也适用于示例中的单字节字符):
dd bs=1 skip=9 count=71 < file 2> /dev/null或者更有效地使用GNU dd:
dd iflag=fullblock,skip_bytes,count_bytes skip=9 count=71 status=none < file对于字符,使用zsh:
{
IFS= read -ru0 -k9 discard &&
IFS= read -ru0 -k71 text &&
printf %s $text
} < file(如果文件中少于80个字符,则不会打印任何内容)。
ksh93和bash有一个-N选项,类似于zsh的S -k,但他们不支持NUL字符和这个bash一个是婴儿车。
使用GNU awk:
awk -v RS='.{1}' -v ORS= 'NR>=10 {print RT}; NR == 80 {exit}'我们使用.{1}作为.,它是一个单独的字符,不会被视为regexp。
另一种选择是将字符编码转换为每个字符具有固定字节数(并具有所有可能的字符)的字符编码,如UTF-32LE,该字符每个字符有4个字节:
< file iconv -t UTF-32LE |
dd bs=4 skip=9 count=71 2> /dev/null |
iconv -f UTF-32LE发布于 2017-04-06 13:20:06
假设换行符对数据没有意义,而只是在文件中格式化(未经测试的代码):
BEGIN {
linesize=70;
start=10;
end=80;
}
// {
if ((NR>=int(start/linesize) && (NR<=int(end/linesize)) {
from = NR==int(start/linesize) ? start % linesize : 0;
to = NR==int(end/linesize) ? (end % linesize)-from : linesize+1;
print substr($0, from, to);
}
if (NR==int(end/linesize)) exit;
}https://unix.stackexchange.com/questions/356297
复制相似问题