2013-05-13 18 views
1

我正在搜索几个小时(实际上已经两天),但找不到我的问题的答案然而。我试过Sed和Awk,但是我无法获得正确的参数。如果行文件1中的数字位于文件2中的两个数字之间,则合并两个文件中的特定行

从本质上讲,这就是我在file_1
寻找

为每行IF [中file_1在colum2值]
      IS在一些行4列等于[价值在file_2]
      OR等于在在file_2一些行在5柱[值]
      OR IS [在值列4和值列5在file_2一些行]
THAN
      ADD柱3,6和的7一些行file_2的 BETWEEN至第3栏,第4和的file_1

NB 5:值需要被比较是整型,在第3栏第6和7的值(即仅需要复制)是字符串

这是上下文中,但可能没有必要RY阅读:


我有两个文件与基因组数据,我想在一个特定的方式进行合并(列都以空格隔开)

  • 第一个文件包含变种(只有那些感兴趣的人的SNP)其中,有效地,只有第二列是相关的。此列号码(在染色体上该变体的位置)
  • 我有一个包含以下数据的结构注释文件的列表:
    • 在柱4是在所述特定结构的和一个开始位置第5栏是结束位置。
    • 柱3,7和9包含描述特定结构(一个基因等的名称)的信息

我想注释变体与在注释中的数据中的第一文件文件。因此,如果变体文件的第2列中的数字等于特定行中这些值的第4列或第5列或第OR列,则需要添加注释中该特定行的第3列,第7列和第9列。


示例文件1

SOME_NON_RELEVANT_STRING 142 
SOME_NON_RELEVANT_STRING 182 
SOME_NON_RELEVANT_STRING 320 
SOME_NON_RELEVANT_STRING 321 
SOME_NON_RELEVANT_STRING 322 
SOME_NON_RELEVANT_STRING 471 
SOME_NON_RELEVANT_STRING 488 
SOME_NON_RELEVANT_STRING 497 
SOME_NON_RELEVANT_STRING 541 
SOME_NON_RELEVANT_STRING 545 
SOME_NON_RELEVANT_STRING 548 
SOME_NON_RELEVANT_STRING 4105 
SOME_NON_RELEVANT_STRING 15879 
SOME_NON_RELEVANT_STRING 26534 
SOME_NON_RELEVANT_STRING 30000 
SOME_NON_RELEVANT_STRING 30001 
SOME_NON_RELEVANT_STRING 40001 
SOME_NON_RELEVANT_STRING 44752 
SOME_NON_RELEVANT_STRING 50587 
SOME_NON_RELEVANT_STRING 87512 
SOME_NON_RELEVANT_STRING 96541 
SOME_NON_RELEVANT_STRING 99541 
SOME_NON_RELEVANT_STRING 99871 

示例文件2

SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A1 0 38 B1 C1 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A2 40 2100 B2 C2 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A3 2101 9999 B3 C3 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A4 10000 15000 B4 C4 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A5 15001 30000 B5 C5 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A6 30001 40000 B6 C6 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A7 40001 50001 B7 C7 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A8 50001 50587 B8 C8 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A9 50588 83054 B9 C9 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A10 83055 98421 B10 C10 
SOME_NON_RELEVANT_STRING SOME_NON_RELEVANT_STRING A11 98422 99999 B11 C11 

样本输出文件

142 A2 B2 C2 
182 A2 B2 C2 
320 A2 B2 C2 
321 A2 B2 C2 
322 A2 B2 C2 
471 A2 B2 C2 
488 A2 B2 C2 
497 A2 B2 C2 
541 A2 B2 C2 
545 A2 B2 C2 
548 A2 B2 C2 
4105 A3 B3 C3 
15879 A5 B5 C5 
26534 A5 B5 C5 
30000 A5 B5 C5 
30001 A6 B6 C6 
40001 A7 B7 C7 
44752 A7 B7 C7 
50587 A8 B8 C8 
87512 A10 B10 C10 
96541 A10 B10 C10 
99541 A11 B11 C11 
99871 A11 B11 C1 
+2

当你扔在一堆特定领域的语言(SNP,基因组,染色体变异体等)时,它使我们很难弄清楚你想要什么。只需发布平面文件(未格式化),并说出类似于“文件1中的给定值X,如果值Y或Z出现在文件2的字段A中,则希望输出两个文件的WHATEVER字段”。 – 2013-05-13 12:44:23

+0

哈哈,非常感谢。我编辑了我的文章并添加了几行,以更常见的方式总结整个故事。希望它能让你更容易理解。 – Elmer 2013-05-13 13:34:49

+0

是的,但你仍然没有发布一些示例输入和预期的输出,我们可以简单地复制/粘贴来测试解决方案。我一个人不打算复制你发布的这些表格,并编辑它们以从它们创建样本输入。 – 2013-05-13 13:36:31

回答

2

作为开始,以下是如何编写您在awk中发布的算法,假设您说“ADD”意味着“追加”并假定file1中的所有行都具有第二个字段的唯一值(针对所提供的示例输入运行):

awk ' 
BEGIN{ FS=OFS="\t"; startIdx=1 } 
NR==FNR { 
    if ($2 in seen) { 
     printf "%s on line %d, first seen on line %d\n", $2, NR, seen[$2] | "cat>&2" 
    } 
    else { 
     f2s[++endIdx] = $2 
     seen[$2] = NR 
    } 
    next 
} 
{ 
    inBounds = 1 
    for (idx=startIdx; (idx<=endIdx) && inBounds; idx++) { 
     f2 = f2s[idx] 
     if (f2 >= $4) { 
      if (f2 <= $5) { 
       print f2, $3, $6, $7 
      } 
      else { 
       inBounds = 0 
      } 
     } 
     else { 
      startIdx = idx 
     } 
    } 
} 
' file1 file2 
142  A2  B2  C2 
182  A2  B2  C2 
320  A2  B2  C2 
321  A2  B2  C2 
322  A2  B2  C2 
471  A2  B2  C2 
488  A2  B2  C2 
497  A2  B2  C2 
541  A2  B2  C2 
545  A2  B2  C2 
548  A2  B2  C2 
4105 A3  B3  C3 
15879 A5  B5  C5 
26534 A5  B5  C5 
30000 A5  B5  C5 
30001 A6  B6  C6 
40001 A7  B7  C7 
44752 A7  B7  C7 
50587 A8  B8  C8 
87512 A10  B10  C10 
96541 A10  B10  C10 
99541 A11  B11  C11 
99871 A11  B11  C11 
+1

这真是太棒了!是的,的确,对于ADD,我的意思是追加。在完美的世界中,file_1中的任何值都不应出现多次。然而,DNA测序仪并不完美,有时往往会产生不可能的数据,所以会产生一些噪音。但是我可以在脚本之前将其过滤掉。我现在在我的大数据集上运行脚本,并会让您知道结果!已经感谢一千次了! – Elmer 2013-05-13 21:44:38

+0

不客气。我刚刚更新了我的答案,以告知第一个文件中的值是否重复,以及重复发生的行号。 – 2013-05-13 22:19:32

+0

再次感谢!它现在在我的数据集上运行,但速度有点慢。基于平均速度,大约需要48小时才能完成。而且,它仅使用16个可用内核中的一个,所以我明天要做的第一件事是将file1分成16块,并启动16个AWK实例。或者AWK中有更简单的选项吗? – Elmer 2013-05-13 23:16:22

相关问题