选择文件 1 的行,其中文件 2 的字段 > x

选择文件 1 的行,其中文件 2 的字段 > x

我有一个大文件 file1,包含很多信息,例如

rs969931    C   A   1.993   1.189   1.003 ..............
rs2745406   C   T   1.993   1.166   1.003 ..............
rs6939431   A   G   0.003   0.207   0.005 ..............
rs1233427   A   G   1.990   1.150   1.001 ..............

第二个文件 file2 包含该信息的质量,其中文件 2 的第 N 行的值对应于文件 1 的第 N 行的质量

0.19893
0.94752
0.93768
0.47781

我想要做的是从文件 1 中选择行,其中文件 2 > 0.5。我能找到的最接近的是一个 ID 匹配问题(从文本文件中选择具有在另一个文件中列出的 id 的行),而这里我需要使用文件 2 的值执行一些逻辑运算。

可能需要对大文件执行多次操作,因此要避免笨重的解决方案,例如将文件 2 附加到文件 1,然后在过滤后将其删除。

答案1

paste qual.txt data.txt | awk '$1 > 0.5'

这将首先使用 生成包含质量值作为第一列和其他数据作为其他列的数据paste。该awk代码只是选择并打印第一列(质量)大于 0.5 的行。

如果您不希望输出的质量:

paste qual.txt data.txt | awk '$1 > 0.5' | cut -f 2-

对于给定的示例,这将生成

rs2745406   C   T   1.993   1.166   1.003 ..............
rs6939431   A   G   0.003   0.207   0.005 ..............

答案2

awkgetline(参见关于 getline 的一切警告)

$ # can also use: awk '{getline num < "file2"} num>0.5' file1
$ awk -v cmp_f='file2' '{getline num < cmp_f} num>0.5' file1
rs2745406   C   T   1.993   1.166   1.003 ..............
rs6939431   A   G   0.003   0.207   0.005 ..............
  • getline num < cmp_f保存一行从file2num
  • num>0.5file1如果满足条件则打印行


我认为下面的版本可能会更好

awk '(getline num < "file2")>0 && num>0.5' file1

相关内容