0

以下是awk命令的组合

awk '
    {if ($0~/>/) {head=$0;getline}
    {if($0~/pattern/) print head"\n"$0}}' filename1 | 
awk 
   'BEGIN  {pos=0;char=0}
    {if($0~/>/) head=$0;getline}
    {pos=0; 
     if($0~/pattern/)
       {pos=match($0,/pattern/);char=substr($0,pos,55)} 
     print head"\n"char}'

以上一个效果很好,我想在识别模式“AATTGGCC”后捕获 55 个字符。问题是如何获得匹配模式的 55 个字符前缀(匹配模式前的 55 个字)。是的,我可以在 perl 中编写全部内容,但是由于我在 awk 中有上述内容,我想知道是否可以以某种方式对其进行修改。

谢谢

4

4 回答 4

0

没有一些样本输入,很难测试,但我相信你非常像 C 的 awk 可以简化为:

awk -v pattern="abcd_or_whatever" -v n=55'
    />/ {head=$0; next}
    pos = match($0, pattern) {print head "\n" substr($0, pos, n)} 
'

要在比赛前获得 55 个字符,您只需将 substr 参数更改为substr($0, pos-n, n)

于 2011-02-19T12:34:22.143 回答
0

这有点蛮力,但您可以使用在 AATTGGCC 之前有 55 个句点的模式

例如:

/.......................................................AATTGGCC/ {print substr(%$0,1,55)}

应该做的伎俩。最好看看 awk 正则表达式是否支持子表达式。

但最好的办法是使用 Python 和像 pygep 这样的库,因为 Python 在生物信息学中被大量使用。

于 2011-02-19T01:19:29.583 回答
0

这是打印模式前面的一些字符的方法的演示:

echo 'abcdefghijklmnopqrstuvwxyz' | 
    awk 'BEGIN {pat = "jkl"; n = 5} 
        pat {
            i = index($0,pat);
            print substr($0, i-n, n + length(pat))
        }'

输出(“jkl”和“jkl”之前的五个字符):

efghijkl

如果您的数据有换行符并且您要输出的字符序列跨越换行符,则需要累积换行符,删除换行符并将足够的字符保留在缓冲区变量中,以便您可以输出它们。

对于它的价值,这是您的脚本的简化版本。它可能无法正常运行,但它更具可读性和更 AWKish。我没有对它做任何事情来尝试使其执行您所需的功能,也没有对其进行测试。

awk '

    />/ {head = $0; getline}

    /pattern/ print head "\n" $0

    ' filename1 | 
awk '

    BEGIN  {pos = 0; char = 0}

    />/) {head = $0; getline}
    {
        pos = 0; 
        if ($0 ~ /pattern/) {
            pos = match($0, /pattern/); char = substr($0, pos, 55)
        } 
        print head "\n" char
    }'
于 2011-02-19T02:30:07.193 回答
0

谢谢大家的建议。关于 awk 代码的格式,我没有在适当的脚本或任何东西中执行它。这一切都在命令行中,因此输出的“管道”如此之多。但我确实理解并会在寻求帮助时尝试以正确的格式编写代码。

我发现 awk 中的 RSTART 是一个跟踪匹配模式的变量,因此我能够按如下方式使用它(这只是实际命令的一部分)。

awk 'BEGIN{pos=0;char=0}{if($0~/>/) head=$0;getline} {pos=0;if($0~/pattern/) {match($0,/pattern/);char=substr($0,RSTART-47,47)}print head"\n"char}'.

这会从匹配模式返回 47 个字符并打印出来。

于 2011-02-19T15:02:32.517 回答