首页 > 解决方案 > 了解 awk 脚本

问题描述

我有以下 awk 脚本,我不明白它的作用或如何正确执行它。

$ awk 'BEGIN{
    first_start=$2;
    old_start=first_start;
    }
    {
        chr=$1;
        current_start=$2;
        if (current_start > (old_start + 1)) {
            print chr"\t"first_start"\t"old_start;
            first_start=current_start;
            old_start=first_start;
        }
        else {
            old_start=current_start;
        }
    }
    END {
        print chr"\t"first_start"\t"old_start;
    }' pileup.txt

输入格式应为:

NC_000001.10    11456   A   0   *   *
NC_000001.10    11467   A   1   ,   E
NC_000001.10    250133  t   2   ..  EA
NC_000001.10    250164  t   2   ..  EE
NC_000001.10    250169  t   2   ..  EE

我试图用它来执行它awk -f pileup_to_bed.awk并得到

awk: pileup_to_bed.awk:1: $ awk 'BEGIN{
awk: pileup_to_bed.awk:1:       ^ invalid char ''' in expression
awk: pileup_to_bed.awk:1: $ awk 'BEGIN{
awk: pileup_to_bed.awk:1:       ^ syntax error

标签: awk

解决方案


当您将代码放在.awk文件中时,您不需要引用'代码(据我了解问题),它应该像(awk文件名是script.awk)。我正在删除BEGIN{first_start=$2;old_start=first_start},因为将其保留在BEGIN部分中是没有意义的,因为其中没有读取任何行,感谢 Ed sir 在这里指出。

    {
        chr=$1;
        current_start=$2;
        if (current_start > (old_start + 1)) {
            print chr"\t"first_start"\t"old_start;
            first_start=current_start;
            old_start=first_start;
        }
        else {
            old_start=current_start;
        }
    }
    END {
        print chr"\t"first_start"\t"old_start;
    }

当我在上面运行时:

awk -f script.awk Input_file

我得到以下输出:

NC_000001.10
NC_000001.10    11456   11456
NC_000001.10    11467   11467
NC_000001.10    250133  250133
NC_000001.10    250164  250164
NC_000001.10    250169  250169

推荐阅读