在下一行标记有和没有结果的行

label the lines that have and do not have result in the next line

我有一个这样的列表:

#chrom  start   end seq
#chrom  start   end seq
#chrom  start   end seq
chr1    214435102   214435132   AAACCGGTCAGCTT...
chr1    214435135   214435165   TCAATGGACTGTTC...
#chrom  start   end seq 
chr1    214873901   214873931   CCAAATCCCTCAGG...   

正如所见,其中一些有结果(第 3 和第 4)而另一些没有(第 1 和 2)

我想做的是首先阅读以“#chrom”开头的行,然后阅读该行之后的行。如果下一行也以 '#chrom' 开头,则打印 0,如果它以其他内容开头,则打印 1。并对以 '#chrom 开头的每一行执行此操作' 没有 通过任何。 我有点想标记那些有序列的。我猜想会有更简单的方法,但到目前为止我能创建的是两行代码;

awk '/#chrom/{getline; print}' raw.txt > nextLine.txt
awk ' == "#chrom" { print "0" }  != "#chrom" { print "1" }' nextLine.txt > labeled.txt

labeled.txt 中的预期输出;

0
0
1
1

我想代码的第二行运行良好。但是,raw.txt 和 nextLine.txt 中包含 '#chrom' 的行数不匹配。如果你能帮助我,我将不胜感激。

谢谢

应该这样做:

awk 'BEGIN { chrom=0 } { 
   if (=="#chrom") { 
      if (chrom==1) print 0; else chrom=1; } 
   else { 
      if (chrom==1) print 1; chrom=0 } 
   }'

一个awk想法:

awk '
{ if (prev=="#chrom")                 # for 1st line of input prev==""
     print ( == "#chrom" ? 0 : 1)   # use ternary operator to determine output
  prev=
}
' raw.txt

或作为 one-liner:

awk '{if (prev=="#chrom") print ( == "#chrom" ? 0 : 1); prev=}' raw.txt

这会生成:

0
0
1
1

就像在生活中一样,在软件中,根据已经发生的事情做事比根据将要发生的事情做事要容易得多。因此,不要根据下一行输入的内容来编写需求,而是根据上一行输入的内容来编写需求,您会发现找出匹配代码要容易得多,并且该代码会比尝试更简单确定下一行输入。

$ cat tst.awk
( == "#chrom") && (NR > 1) {
    print ( prev == "#chrom" ? 0 : 1 )
}
{ prev =  }
END {
    print ( prev == "#chrom" ? 0 : 1 )
}

$ awk -f tst.awk file
0
0
1
1