跨文件交叉引用列

跨文件交叉引用列

我确信一定有办法做到这一点,但我被困住了,所以希望得到你的帮助。我有两个文件,如下所示:

文件1:

8750    11.29592283
8800    7.500359335
14150   3.281781819
23850   3.668931975
23900   14.69918465
23950   5.259260427
27300   3.374571119

文件2:

hypothetical protein CDS                7152            7346            TK0006
hypothetical protein CDS                7399            7614            TK0007
DNA methylase CDS               7655            8755            TK0008
hypothetical protein CDS                8760            10093           TK0009
hypothetical protein CDS                10095           10379           TK0010
hypothetical protein CDS                10385           10807           TK0011

file1为基因组坐标和表达值; File2是基因组注释。我需要的是column1 file1中的值是否在column2 file2和column3 file3之间;返回每个文件的完整行。例如,file1 的前两行将返回以下输出:

8750    11.29592283    DNA methylase CDS               7655            8755            TK0008
8800    7.500359335    hypothetical protein CDS                8760            10093           TK0009

使用简短的 awk 命令或类似命令可以实现这样的过程吗?还是我贪多嚼不烂?

谢谢!!

答案1

awk解决方案:

awk -F'[[:space:]][[:space:]]+' 'NR==FNR{ a[$1]=$0; next }
     {  for(i in a) { 
            if (int(i) >= $2 && int(i) <= $3) { 
                print a[i],$0; delete a[i]; break 
            } 
        }
     }' File1 OFS='\t' File2

输出:

8750    11.29592283 DNA methylase CDS               7655            8755            TK0008
8800    7.500359335 hypothetical protein CDS                8760            10093           TK0009

  • -F'[[:space:]][[:space:]]+'- 定义字段分隔符的模式

  • a[$1]=$0- 从中获取关键价值File1

  • if (int(i) >= $2 && int(i) <= $3)- 检查第一个字段值是否File1在范围内(在第二个和第三个字段值之间File2

  • delete a[i]- 删除匹配的值

  • break- 打破循环以避免冗余迭代

相关内容