我有一个大文件 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
与awk
和getline
(参见关于 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
保存一行从file2
到num
num>0.5
file1
如果满足条件则打印行
我认为下面的版本可能会更好
awk '(getline num < "file2")>0 && num>0.5' file1