【问题标题】:How to compare data in different row AND column?如何比较不同行和列中的数据?
【发布时间】:2021-11-20 19:49:25
【问题描述】:

希望你一切都好。我发现了与我要问的问题相近的问题,但没有一个是完全正确的。在过去的两周里,我一直在为此苦苦挣扎,终于设法取得了足够的进展,我觉得我可以在这里提问!

我已经从我 BLASTED 的序列中下载了一个 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 '($1==c1 && $3==c3 && $4==c4){print line RS $0}{line=$0;c1=$1;c4<$3}' mydata.txt

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

我还尝试使用找到的代码 HEREHERE 来应用我的问题,我觉得这与我正在尝试做的事情很接近。我还查看了 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 中的一些条目分开和重叠.txt。我将检查两个文件夹之间是否有任何相同的 acc.no,首先处理重叠,然后添加到不重叠的条目中,然后从那里继续。此处可以重复(请参阅两个 txt 文件中的 AC020656|33 87.654 120390 121470),我知道我是如何处理这些的,只是为了确认在我的真实数据上使用的方法。

TL;DR:使用基于 id(Acc.no)的分组,我可以将列中的数据与不同列和下面的行中的数据进行比较吗?对适合操作系统用户的循环、脚本或单/两行答案感到满意

提前感谢您,非常欢迎任何建议,感谢您抽出时间阅读/回答我的问题。

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

【问题讨论】:

  • 如果您有 4 行相同的 acc ($1) 并且前 2 行的 seq 重叠但第二 2 行不重叠怎么办?该 acc 的所有 4 行是否都进入 1 个文件,如果是,重叠文件或 nooverlap 文件?如果不是 - 会发生什么?请edit您的示例输入/输出包含该案例。
  • 好点,我还没有看到任何这样的案例,但已经相应地更新了理想的情况!

标签: shell awk compare blast


【解决方案1】:

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

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

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

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

    split(prev,p)
    if ( ($1 == p[1]) && ($3 <= p[4]) ) {
        print prev > over
        print $0   > 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

如果这还不是您所需要的,那么请编辑您的问题以提供更具代表性的示例输入/输出,其中包括上述不适用于的情况。

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

【讨论】:

  • 嗨,Ed,非常感谢您的帮助,我已经试用了脚本,它就快到了!发生的事情是重叠序列被正确标记并放入overlap.txt。但是没有添加相应的序列,所以它是一个条目。我的数据格式如上,我没有碰过你的代码,所以不知道我的去哪儿了。
  • 我不知道BUT the corresponding sequence is not been added, so it's a single entry是什么意思,抱歉。
  • 好的,我更新了我的答案以从新输入中产生新的预期输出。
  • 不客气。我宁愿你只是在你的问题的结尾添加一些东西,因为这可能会以正确或错误的方式完成,我会尽快不参与其中,也许会从其他人那里得到关于它等等。至少在我看来,这个问题已经得到解答,是时候继续前进了。
  • 再次感谢 Ed,我会用我正在使用的内容修改我的帖子!一切顺利,度过愉快的一周
猜你喜欢
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2021-12-16
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多