【问题标题】:Extracting data when cross referencing two column from different files and for each value print a new file交叉引用来自不同文件的两列并为每个值打印一个新文件时提取数据
【发布时间】:2019-02-21 19:09:17
【问题描述】:

我有两个文件,当文件 2 中的模式与文件 1 中第 3 列或第 7 列的模式完全匹配时,我想使用该模式来提取数据。例如,我想从文件 1 中提取具有值的所有行第 3 列或第 7 列中的“5”。 另外,我想如果文件 2 中每个值的数据可以打印到它自己的新文件中。 所有列都由制表符分隔。

文件 1

... ... RNAME ... ... ... RNEXT
  x   x    3    x   x   x    128
  x   x   102   x   x   x     5
  x   x    2    x   x   x     =
  x   x    5    x   x   x     =
  x   x    72   x   x   x     7
  x   x    5    x   x   x    251`

文件 2

 5
 72
 1040
 251
...

我已使用 awk '($3 == "5" || $7 == "5")' File 1 手动为文件 2 的特定值执行此操作。

文件 3(我希望文件 2 的所有值作为单独的文件)

... ... RNAME ... ... ... RNEXT
  x   x    5    x   x   x     =
  x   x   102   x   x   x     5
  x   x    5    x   x   x     =
  x   x    5    x   x   x   1040
  x   x    138  x   x   x     5
  x   x    5    x   x   x    251

对于上下文,我的文件 1 是测序数据(.sam 格式)的映射,具有大约 2.5 亿个映射读取(行),文件 2 是感兴趣的重叠群。 任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 欢迎来到 SO,所以您的意思是说您想将5 与 file1 的所有内容进行一次比较?并且对于 file1 的所有行,所有行 1 by 1 相同,请确认一次。
  • 是的,所以我提取文件 1 的所有行,在第 3 列或第 7 列中带有“5”。对于文件 2 的所有值,依此类推。
  • 仍然不清楚,最后一列和其他列的值如何变化?请解释一下。
  • file2 有多少行?应该如何命名输出文件?如果 file1 中的一行在 file2 中出现的两列中都有值,会发生什么?
  • 因此列 RNAME 和 RNEXT 可以是 (1-2737) 之间的任何值,如果它们具有相同的值,则在其中一个中使用符号“=”。相同的值也可以在文件中出现多次。我只对这些值中的 160 个(它们是我的文件 2)以及它们出现的所有行感兴趣。所以我想遍历文件 1 的每一行,在文件 2 中搜索一个值(例如“5”) $3 或 $7 列,如果匹配,则提取整行。我希望以“他们正在搜索”的值命名输出文件。 (例如“contig5”、“contig72”、“contig1040”等。

标签: unix awk grep


【解决方案1】:

由于您没有大量可能的值要检查,因此在 awk 中很容易做到(file2 中的行太多会导致您在将行写入适当的文件时用尽可用的文件描述符(s ),但160应该不错):

$ awk 'NR == FNR { contig[$1] = 1;
                   print "...\t...\tRNAME\t...\t...\t...\tRNEXT" > "contig" $1;
                   next }
       $3 in contig { print > "contig" $3 }
       $7 in contig { print > "contig" $7 }' file2 file1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-29
    • 2017-09-18
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2017-04-19
    • 2023-02-01
    • 2017-09-11
    相关资源
    最近更新 更多