如果一列的值等于上一行中同一列的值加一,则给出相同的代码

If value of a column equals value of same column in previous line plus one, give the same code

我有一些数据如下所示:

chr1    3861154 N   20
chr1    3861155 N   20
chr1    3861156 N   20
chr1    3949989 N   22
chr1    3949990 N   22
chr1    3949991 N   22

我需要做的是根据第2列给出一个代码。如果该值等于上一行的值加一,那么它们来自同一系列,我需要在一个中给它们相同的代码新专栏。该代码可能是该系列第一行的值。此示例的所需输出为:


chr1    3861154 N   20  3861154
chr1    3861155 N   20  3861154
chr1    3861156 N   20  3861154
chr1    3949989 N   22  3949989
chr1    3949990 N   22  3949989
chr1    3949991 N   22  3949989

我正在考虑使用 awk,但这当然不是必需的。 关于如何使这项工作有任何想法吗?

编辑以添加我正在使用的代码:

awk 'BEGIN {var = } {if ( == var+1) print [=12=]"\t"var; else print [=12=]"\t"; var =  }' test

我觉得想法是有的,但是还不太对。我得到的结果是:

chr1    3861154 N   20  3861154
chr1    3861155 N   20  3861154
chr1    3861156 N   20  3861155
chr1    3949989 N   22  3949989
chr1    3949990 N   22  3949989
chr1    3949991 N   22  3949990

谢谢!

$ cat tst.awk
(NR == 1) || ( != (prev+1)) {
    val = 
}
{
    print [=10=], val
    prev = 
}

$ awk -f tst.awk file
chr1    3861154 N   20 3861154
chr1    3861155 N   20 3861154
chr1    3861156 N   20 3861154
chr1    3949989 N   22 3949989
chr1    3949990 N   22 3949989
chr1    3949991 N   22 3949989

你脚本中最大的错误是这部分:

BEGIN {var = }

因为:

  • </code>是当前输入行的第二个字段。</li> <li><code>BEGIN 在读取任何输入行之前执行。

因此 BEGIN 部分中 的值是零或空,就像任何其他未设置的变量一样。