如何比较不同行和列中的数据?

How to compare data in different row AND column?

希望你一切都好。我发现的问题与我要问的很接近,但完全 none。在过去的两周里,我一直在努力解决这个问题,终于取得了一些进展,我觉得我有理由在这里提问!

我已经从我爆破的序列中下载了一个 HitTable

accno    percent     seqstart seqend        
AC020656|33 84.713  116580  116735  
AC020656|33 90.303  118279  118443  
AC020656|33 87.654  120390  121470  
AC020656|33 82.609  121323  121390      
AC123694|11 77.622  158333  158474  
AC123694|11 84.559  158238  160142  

我想做的是找出每个条目(登录号)的这些命中中哪些是重叠的,哪些不是重叠的,这样我就可以继续我的管道的其余部分。我的目标是将 ID(或整行,此时我并不大惊小怪!)放入单独的文件中,然后使用它们提取相应的 FASTA 文件,以便我可以根据它是否重叠或应用更合适的程序没有。

我觉得最好的方法是使用 awk 来:

  1. 检查 ID ($1) 是否相同(一起检查 AC020656|33 第 4 行和 AC123694|11 第 4 行没有用!)
  2. 如果 seq end ($4) 小于下一行的 seq start ($3),则比较。如果是这样,将其打印在名为“nonover.txt”的文件中,否则打印到“overlap.txt”

我通过修改找到的代码开始尝试这个答案 HERE:

awk '(==c1 && ==c3 && ==c4){print line RS [=13=]}{line=[=13=];c1=;c4<}' mydata.txt

但是,毫不奇怪,它不起作用,因为我显然遗漏了一些东西。我链接的答案中的 OP 非常友好地解释了它,使我有信心对其进行调整,但是,那是我的无能!

我还尝试使用找到的代码 HERE and HERE 来解决我的问题,我觉得它已经接近我正在尝试做的事情。我还查看了 awk 的手册,虽然它确实有点帮助(我尝试使用 getline 函数,但一直被错误击中),老实说,我认为我不够精通立即解决这个问题。

正如 markp-fuso 所指出的,我的上述输出理想情况下是两个文件,其中包含以下数据:

noverlap.txt (as each rows seqend is smaller than the next rows seqstart, therefore it's not overlapped)
accno    percent     seqstart seqend        
AC020656|33 84.713  116580  116735  
AC020656|33 90.303  118279  118443  
AC020656|33 87.654  120390  121470

overlap.txt (as each rows seqend is larger than the next rows seqstart, and it is overlapping)
accno    percent     seqstart seqend
AC020656|33 87.654  120390  121470  
AC020656|33 82.609  121323  121390  

AC123694|11 77.622  158333  158474  
AC123694|11 84.559  158238  160142 

正如 Ed Morton 所指出的,如果某些条目重叠而其他条目不重叠,acc.no 应该如何处理 - 将它们分开是可以的noverlap.txt 和 overlap.txt 中的一些条目。我将检查两个文件夹之间是否有任何相同的 acc.no,将首先处理重叠部分,然后添加到非重叠条目中,然后从那里继续。重复在这里很好(请参阅两个 txt 文件中的 AC020656|33 87.654 120390 121470),我知道我是如何处理这些的,这只是为了让我可以确认在我的真实数据上使用的方法。

TL;DR: 使用基于 id (Acc. no) 的分组,我可以将一列中的数据与不同列和下一行中的数据进行比较吗?对适合 OS 用户

的循环、脚本或 one/two 行答案感到满意

提前谢谢你,非常欢迎任何建议,感谢你抽出时间来回答我的问题read/answer。

更新:感谢出色的 Ed Morton 提供的完美解决方案。我只是添加我正在做的事情,以删除在非重叠 txt 文件中找到的单个重复条目(但发现它们应该重叠的地方),这正在修改在此答案 HERE[=19 中找到的代码=]

这将从提供​​的示例输入中产生所提供的预期输出:

$ cat tst.awk
{ sub(/\r$/,"") }
NR == 1 { hdr = [=10=] }
NR  > 2 { prt() }
{ prev = [=10=] }

function prt(   over, noover, p, out) {
    over   = "overlap.txt"
    noover = "noover.txt"

    if ( !doneHdr++ ) {
        print hdr > over
        print hdr > noover
    }

    split(prev,p)
    if ( ( == p[1]) && ( <= p[4]) ) {
        print prev > over
        print [=10=]   > over
        print ""   > over
    }
    else {
        print prev > noover
    }
}

$ awk -f tst.awk file
$ head *over*
==> noover.txt <==
accno    percent     seqstart seqend
AC020656|33 84.713  116580  116735
AC020656|33 90.303  118279  118443
AC020656|33 82.609  121323  121390

==> overlap.txt <==
accno    percent     seqstart seqend
AC020656|33 87.654  120390  121470
AC020656|33 82.609  121323  121390

AC123694|11 77.622  158333  158474
AC123694|11 84.559  158238  160142

如果这不是您所需要的全部,请编辑您的问题以提供更具代表性的样本 input/output,其中包括上述方法不适用的情况。

请注意,除了 header 之外,以上内容至少需要 2 条数据线才能出现在输入中。如果只有 1 条数据线,则不会打印。如果这是一个问题,请添加一些逻辑以在 NR 小于 3 或类似值时在 END 部分中打印 hdrprev