awk比较相邻行并根据if语句打印
我有一个包含多行的文件(从基因组读取),它们被排序(基于它们的位置)。现在我想在这些行上循环,如果多行具有相同的ID(第4列),我想保留第一行,如果第3列是加号,或者最后一行,如果第3列是减号。这是m代码,但似乎我的变量(lastID)在每行之后都没有正确更新。 小费是非常感谢的awk比较相邻行并根据if语句打印,awk,Awk,我有一个包含多行的文件(从基因组读取),它们被排序(基于它们的位置)。现在我想在这些行上循环,如果多行具有相同的ID(第4列),我想保留第一行,如果第3列是加号,或者最后一行,如果第3列是减号。这是m代码,但似乎我的变量(lastID)在每行之后都没有正确更新。 小费是非常感谢的 awk 'BEGIN {lastline=""; lastID=""} {if ($lastline != "" && $4 != $last
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,并特别感谢您以代码的形式分享您的努力。为了让问题更清晰,我们总是建议添加输入和预期输出的样本,所以请在您的问题中添加相同的样本,然后让我们知道。不客气。看看下一步该怎么办。不客气。看看接下来要做什么。