grep流中一行的前X个字符

克里斯

抱歉,如果这只是这里的简单正则表达式,我正在尝试为一行中的前X个字符设置grep。我最初的想法是

#!/usr/bin/env bash
X=$1    
cat filename | ... stream ... | grep -r '\w{0,$X}'

虽然我实际上并不认为这行得通...

基本上,假设我有以下内容:

ATGGCGAGAGAGGTGCCTATAGAGAAATTGAGAAACATAGGTATAGTTGCTCACATTGACGCGGGTAAAACTACGACTAC
CGAGAG**A**ATTCTCTATTACACGGGTAAGACTTACAAGATAGGTGAAGTTCACGAAGGTGCTGCAACGATGGACTGGATGC
CCCAGGAAAAGGAAAGAGGTATAACCATAACCGTTGCAACGACCGCATGTTATTGGACGAGAAACGGGGAGAGGTATCAA

如果我想grep到第二行的第七名,我该怎么做?什么正则表达式将只能获得以下内容:

ATGGCGAGAGAGGTGCCTATAGAGAAATTGAGAAACATAGGTATAGTTGCTCACATTGACGCGGGTAAAACTACGACTAC

CGAGAGA

更详细的解释:

我目前所打印的内容打印出了指示位置所在的行及其之前的行,但没有指出该位置在输出中的确切位置(我将我的fasta文件编入此行):

#!/usr/bin/env bash
spot=$1
myvar=`expr $spot / 81`
#later, I awk in the line number as a column, to navigate
X=$(($spot % 81))
#since each line in the file I'm looking at has 81 characters per line (not including the newline character), this gives the spot I'm looking for

grep -v '>' | awk | 'BEGIN{t=-1}{t = t + 1; {print t, $0}}' | grep -B 1 "$myvar" | head

基本上是尝试启动一个简单的命令行FASTA文件导航器(核苷酸序列,蛋白质序列),以及在指定位置查看序列的内容(我这里还没有使用$ X)。

因此,例如,如果我想按以下顺序读取到第9个位置(此处为粗体T)(例如,类似于10051位置,它在第7行的第124行上

\>NC_000918.1 Aquifex aeolicus VF5, complete sequence

...

ATGGCGAGAGAGGTGCCTATAGAGAAATTGAGAAACATAGGTATAGTTGCTCACATTGACGCGGGTAAAACTACGACTAC
CGAGAG**A**ATTCTCTATTACACGGGTAAGACTTACAAGATAGGTGAAGTTCACGAAGGTGCTGCAACGATGGACTGGATGC
CCCAGGAAAAGGAAAGAGGTATAACCATAACCGTTGCAACGACCGCATGTTATTGGACGAGAAACGGGGAGAGGTATCAA

我想我理解为包括两个前行,和``现在的”排队直到第9位,等等(基于脚本我现在有),我想是这样

ATGGCGAGAGAGGTGCCTATAGAGAAATTGAGAAACATAGGTATAGTTGCTCACATTGACGCGGGTAAAACTACGACTAC

CGAGAGA

当前,脚本给出了(这123个ATGGCG ...列,以防万一将其包装并使其不清楚)

123    ATGGCGAGAGAGGTGCCTATAGAGAAATTGAGAAACATAGGTATAGTTGCTCACATTGACGCGGGTAAAACTACGACTAC

124    CGAGAGAATTCTCTATTACACGGGTAAGACTTACAAGATAGGTGAAGTTCACGAAGGTGCTGCAACGATGGACTGGATGC

和其他包含123、124的行。我不介意行号(尽管我很容易摆脱它们),但我只是想在这里获得更具体的观点。

我对bash脚本还很陌生,所以让我知道我是否还写了一些怪异的东西!

(注意:我显示的行实际上是VF5 fasta文件的前三行,我只是假装使它们成为124、123等行来说明这一点)

齐奥诺

假设:

  • 您要打印包含指定位置的行,该字符的长度从序列的开头算起。
  • 您想在指定位置终止行,而不打印整个匹配的行。
  • 您要包括上一行。

那请您尝试一下awk解决方案:

#!/bin/bash

spot=$1                         # assigned to "10051" or whatever
awk -v spot="$spot" '!/^>/ {
    amount += length
    if (amount >= spot) {
        print(prev substr($0, 1, spot - (amount - length)))
        exit
    }
    prev = $0 RS
}' file.fasta
  • -v spot="$spot"选项将awk变量分配spot给bash变量$spot
  • 该模式!/^>/跳过标题行。
  • 该变量amount累积字符长度。
  • 该变量prev保留前一行(附加到RS,记录分隔符)。

请注意,FASTA格式的行长未固定为特定值,例如80。该文档仅描述为:

建议所有文本行的长度都应少于80个字符。

那么最好简单地计算行的长度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章