Printing 避免AWK打印初始空行

Printing 避免AWK打印初始空行,printing,awk,Printing,Awk,我很确定这是直截了当的,但我还没有发现与这个问题相关的问题。 我正在使用下一个代码在PosGen.bed5列中打印给定基因的第一个起始位点和最后一个终止位点 awk 'BEGIN{ch=$1;ini=$2;fin=$3;gen=$5}{if(gen==$5){fin=$3}else{print ch"\t"ini"\t"fin"\t"gen;ch=$1;ini=$2;fin=$3;gen=$5}}}END{print ch"\t"ini"\t"fin"\t"gen}' PosGen.bed |

我很确定这是直截了当的,但我还没有发现与这个问题相关的问题。 我正在使用下一个代码在
PosGen.bed
5列中打印给定基因的第一个起始位点和最后一个终止位点

awk 'BEGIN{ch=$1;ini=$2;fin=$3;gen=$5}{if(gen==$5){fin=$3}else{print ch"\t"ini"\t"fin"\t"gen;ch=$1;ini=$2;fin=$3;gen=$5}}}END{print ch"\t"ini"\t"fin"\t"gen}' PosGen.bed | head

我所做的是保留第一个站点>开始在
结束之前有一个额外的
}
使您的代码失败(给出错误),将其删除

BEGIN
部分不做任何事情,因为在运行第一行之前,
$1、$2等不包含任何内容

重新编写代码,使其更易于阅读。
由于
gen
在第一次运行时不包含任何内容,因此您可以
if
转到
else
部分。
它做的第一件事就是打印
ini
fin
gen
。在第一次运行时,它不包含任何内容,请给出空行(错误地使用了
BEGIN

PS在此处发布时,请选择代码,然后单击
{}
以概述代码


因此,要解决这个问题,请将
BEGIN
更改为
NR==1
,使其在第一行运行,如下所示:

awk -v OFS='\t' '
NR==1 {
    ch=$1
    ini=$2
    fin=$3
    gen=$5
}
{
    if (gen==$5) {
        fin=$3
    }
    else {
        print ch, ini, fin, gen
        ch=$1
        ini=$2
        fin=$3
        gen=$5
    }
}
END {
    print ch, ini, fin, gen
}
' file
chr1    3204563 3661429 Xkr4
chr1    4280927 4399268 Rp1
chr1    4481009 4486494 Sox17
chr1    4763279 4764597 Mrpl15

如果在
END
之前有一个额外的
}
使您的代码失败(给出错误),请将其删除

BEGIN
部分不做任何事情,因为在运行第一行之前,
$1、$2等不包含任何内容

重新编写代码,使其更易于阅读。
由于
gen
在第一次运行时不包含任何内容,因此您可以
if
转到
else
部分。
它做的第一件事就是打印
ini
fin
gen
。在第一次运行时,它不包含任何内容,请给出空行(错误地使用了
BEGIN

PS在此处发布时,请选择代码,然后单击
{}
以概述代码


因此,要解决这个问题,请将
BEGIN
更改为
NR==1
,使其在第一行运行,如下所示:

awk -v OFS='\t' '
NR==1 {
    ch=$1
    ini=$2
    fin=$3
    gen=$5
}
{
    if (gen==$5) {
        fin=$3
    }
    else {
        print ch, ini, fin, gen
        ch=$1
        ini=$2
        fin=$3
        gen=$5
    }
}
END {
    print ch, ini, fin, gen
}
' file
chr1    3204563 3661429 Xkr4
chr1    4280927 4399268 Rp1
chr1    4481009 4486494 Sox17
chr1    4763279 4764597 Mrpl15

正如@Jotne指出的,您误解了
开始
的用法-它是在打开第一个输入文件进行读取之前执行的,因此
$0
$1
等没有在该部分中填充。请尝试以下方法:

$ cat tst.awk
BEGIN{ OFS="\t" }
{
    if ($5 == gen) {
        fin = $3
    }
    else {
        prtGen()
        ch  = $1
        ini = $2
        gen = $5
    }
}
END { prtGen() }

function prtGen() {
    if (ini != "") {
        print ch, ini, fin, gen
    }
}
$
$ awk -f tst.awk file
chr1    3204563 3661429 Xkr4
chr1    4280927 4399268 Rp1
chr1    4481009 4486494 Sox17
chr1    4763279 4764597 Mrpl15

请注意,如果输入文件为空(这是您一直希望从文本处理脚本获得的内容),则上述操作不会产生任何输出。

正如@Jotne所指出的,您误解了
开始的用法-它是在打开第一个输入文件进行读取之前执行的,因此
$0
$1
,等。该部分中未填充ar。请尝试以下方法:

$ cat tst.awk
BEGIN{ OFS="\t" }
{
    if ($5 == gen) {
        fin = $3
    }
    else {
        prtGen()
        ch  = $1
        ini = $2
        gen = $5
    }
}
END { prtGen() }

function prtGen() {
    if (ini != "") {
        print ch, ini, fin, gen
    }
}
$
$ awk -f tst.awk file
chr1    3204563 3661429 Xkr4
chr1    4280927 4399268 Rp1
chr1    4481009 4486494 Sox17
chr1    4763279 4764597 Mrpl15

请注意,如果输入文件为空(这是您一直希望从文本处理脚本中获得的内容),则上述方法将不会产生任何输出。

这不是空行起始问题的答案,但如果输入文件顺序为:

awk '$NF!=p{print x}{p=$NF}1' file | awk '{print $1,$2,$(NF-2),$NF}' RS=
输出:

chr1 3204563 3661429 Xkr4
chr1 4280927 4399268 Rp1
chr1 4481009 4486494 Sox17
chr1 4763279 4764597 Mrpl15

这不是空行起始问题的答案,但在这种情况下,如果输入文件的顺序是:

awk '$NF!=p{print x}{p=$NF}1' file | awk '{print $1,$2,$(NF-2),$NF}' RS=
输出:

chr1 3204563 3661429 Xkr4
chr1 4280927 4399268 Rp1
chr1 4481009 4486494 Sox17
chr1 4763279 4764597 Mrpl15

空白区的价格出人意料地便宜,在编写代码时投资一些空白区总是明智的。简洁并不是软件的一个理想属性,简洁才是。空白令人惊讶地便宜,在编写代码时投资一些总是明智的。简洁不是软件的理想属性,简洁才是。非常感谢!的确,我误解了
BEGIN
的用法,非常感谢!事实上,我误解了
BEGIN