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