awk比较相邻行并根据if语句打印

awk比较相邻行并根据if语句打印,awk,Awk,我有一个包含多行的文件(从基因组读取),它们被排序(基于它们的位置)。现在我想在这些行上循环,如果多行具有相同的ID(第4列),我想保留第一行,如果第3列是加号,或者最后一行,如果第3列是减号。这是m代码,但似乎我的变量(lastID)在每行之后都没有正确更新。 小费是非常感谢的 awk 'BEGIN {lastline=""; lastID=""} {if ($lastline != "" && $4 != $last

我有一个包含多行的文件(从基因组读取),它们被排序(基于它们的位置)。现在我想在这些行上循环,如果多行具有相同的ID(第4列),我想保留第一行,如果第3列是加号,或者最后一行,如果第3列是减号。这是m代码,但似乎我的变量(lastID)在每行之后都没有正确更新。 小费是非常感谢的

awk 'BEGIN {lastline=""; lastID=""}
{if ($lastline != "" && $4 != $lastID)
        {print $lastline; lastline=""};
if ($3 == "+" && $4 != $lastID)
        {print $0; lastline=""}
else if ($3 == "+" && $4 == $lastID)
        {lastli=""}
else if ($3 == "-")
        {lastline=$0}; 
lastID=$4
}' file

要在awk中访问变量的值,只需使用变量的名称,就像在C和大多数其他基于Algol的语言中一样。您不会像使用shell一样将
$
粘贴在它前面。尝试更改:

$lastline != "" && $4 != $lastID
致:

等等

这可能是您正在尝试做的(您的“开始”部分没有做任何有用的事情,所以我只是将其删除):


当像这样合理地格式化时,您可以看到
lastli
从未在任何地方使用过,除非它被设置为
“”
所以这可能是一个bug-可能它应该是
lastline
,在这种情况下,它可以变得通用,而不是在
if
else
legs中设置?

要访问awk中变量的值,只需使用变量的名称,就像在C和大多数其他基于Algol的语言中一样。您不会像使用shell一样将
$
粘贴在它前面。尝试更改:

$lastline != "" && $4 != $lastID
致:

等等

这可能是您正在尝试做的(您的“开始”部分没有做任何有用的事情,所以我只是将其删除):


当像这样合理地格式化时,您可以看到
lastli
从未在任何地方使用过,除非它被设置为
“”
所以这可能是一个bug-也许它应该是
最后一行
,在这种情况下,它可以变得通用,而不是同时在
if
else
legs中设置?

您可能想利用
awk
自己的
条件{statement}
结构。注意,代码布局并不是被普遍接受的,但我发现对于简短的语句更容易阅读

$ awk '$lastline!="" && $4 != $lastID {print lastline; lastline=""}
       $3=="+"       && $4 != $lastID {print; lastline=""}
       $3=="+"       && $4 == $lastID {lastli=""}
       $3=="-"                        {lastline=$0}
                                      {lastID=$4}' file

您可能希望利用
awk
自己的
条件{statement}
结构。注意,代码布局并不是被普遍接受的,但我发现对于简短的语句更容易阅读

$ awk '$lastline!="" && $4 != $lastID {print lastline; lastline=""}
       $3=="+"       && $4 != $lastID {print; lastline=""}
       $3=="+"       && $4 == $lastID {lastli=""}
       $3=="-"                        {lastline=$0}
                                      {lastID=$4}' file

欢迎来到SO,特别感谢您以代码的形式分享您的努力。为了让问题更清晰,我们始终建议添加输入和预期输出的示例,因此请在您的问题中添加相同的示例,然后让我们知道。欢迎使用so,并特别感谢您以代码的形式分享您的努力。为了让问题更清晰,我们总是建议添加输入和预期输出的样本,所以请在您的问题中添加相同的样本,然后让我们知道。不客气。看看下一步该怎么办。不客气。看看接下来要做什么。