在下一行标记有和没有结果的行
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
我有一个这样的列表:
#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