首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unix:获取文件中的字符10至80

unix:获取文件中的字符10至80
EN

Unix & Linux用户
提问于 2017-04-06 08:33:02
回答 2查看 1.6K关注 0票数 4

我有一个包含行分隔文本的文件:

代码语言:javascript
复制
GCAACACGGTGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCCTAGTCCATCAGCAAATGCCGTTTCCAGCAATGCAAAGAGAACGGGAAGGTATCAGTTCACCG
GTGACTGCCATTACTGTGGACAAAAAGGGCACATGAAGAGAGACTGTGACAAGCTAAAGGCAGATGTAGC

从这里,我想提取字符10到80,所以:

代码语言:javascript
复制
TGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCCT

我发现了如何计算文件中的字符:

代码语言:javascript
复制
  wc -m file

以及如何获取每行字符数:

代码语言:javascript
复制
 awk '{print substr($0,2,6)}' file

但是我想不出一种方法来获得10到80的角色。

新行不算作字符。

有什么想法吗?

是的,这是DNA,来自全基因组。我从包含不同脚手架的fasta文件中提取了这段DNA (在本例中是10和11 )。

代码语言:javascript
复制
 awk '/scaffold_10\>/{p=1;next} /scaffold_11/{p=0;exit} p'

最后,我希望有一个简单的命令从指定的支架中获取字符100到800 (或类似的字符)。

编辑:问题继续在这里:使用gff2而不是bash脚本从全基因组中提取部分DNA序列.

EN

回答 2

Unix & Linux用户

发布于 2017-04-06 13:59:06

对于字节(也适用于示例中的单字节字符):

代码语言:javascript
复制
dd bs=1 skip=9 count=71 < file 2> /dev/null

或者更有效地使用GNU dd

代码语言:javascript
复制
dd iflag=fullblock,skip_bytes,count_bytes skip=9 count=71 status=none < file

对于字符,使用zsh

代码语言:javascript
复制
{
  IFS= read -ru0 -k9 discard &&
    IFS= read -ru0 -k71 text &&
    printf %s $text
} < file

(如果文件中少于80个字符,则不会打印任何内容)。

ksh93bash有一个-N选项,类似于zsh的S -k,但他们不支持NUL字符和这个bash一个是婴儿车

使用GNU awk

代码语言:javascript
复制
awk -v RS='.{1}' -v ORS= 'NR>=10 {print RT}; NR == 80 {exit}'

我们使用.{1}作为.,它是一个单独的字符,不会被视为regexp。

另一种选择是将字符编码转换为每个字符具有固定字节数(并具有所有可能的字符)的字符编码,如UTF-32LE,该字符每个字符有4个字节:

代码语言:javascript
复制
< file iconv -t UTF-32LE |
   dd bs=4 skip=9 count=71 2> /dev/null |
   iconv -f UTF-32LE
票数 5
EN

Unix & Linux用户

发布于 2017-04-06 13:20:06

假设换行符对数据没有意义,而只是在文件中格式化(未经测试的代码):

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/356297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档