从不同文件交叉引用两列时提取数据,并为每个值打印一个新文件

时间:2019-02-21 10:06:56

标签: unix awk grep

我有两个文件,当它与文件1中第3列或第7列的模式完全匹配时,我想使用文件2中的模式提取数据。例如,我想从文件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是具有约2.5亿个映射读取(行)的测序数据(.sam格式)的映射,文件2是感兴趣的重叠群。 任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

由于您没有大量可能的值要检查,因此在awk中非常容易(在file2中包含太多行会导致在将行写入适当的文件时耗尽可用的文件描述符。 ),但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