在匹配图案之前打印字符

时间:2011-02-18 22:41:49

标签: awk position match prefix

以下是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 个答案:

答案 0 :(得分:0)

这有点暴力,但你可以使用在AATTGGCC之前有55个周期的模式

例如:

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

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

但最好的方法是使用Python和library like pygep,因为Python在生物信息学中被大量使用。

答案 1 :(得分: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
    }'

答案 2 :(得分: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)

答案 3 :(得分: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个字符并打印出来。