【发布时间】:2021-05-04 14:49:36
【问题描述】:
我在 Linux 中有两个文件 一个文件有两列 3 亿行,另一个文件有 1 列 1498 行(SNPs rs IDs from HG19)。
第一个文件如下所示。第一列有坐标并且在坐标值之间有冒号 (1:10019:TA:T),第二列有 ID (rs775809821)
1:10019:TA:T rs775809821
1:10039:A:C rs978760828
1:10043:T:A rs1008829651
1:10051:A:G rs1052373574
1:10055:T:A rs892501864
1:10055:T:TA rs768019142
1:10165:A:AC rs796884232
第二个文件只有一列,看起来像这样
rs11234969
rs372076
rs10417746
rs2476601
rs10760127
我想将第二个文件中的值与第一个文件中的值相匹配,这样我就可以拥有一个最终文件,其中包含文件 2 中的所有可能行以及文件 1 中的坐标。
我尝试了 'grep' 和 awk 但没有成功。
grep -F file1.txt file2.txt | cut -d ' ' -f1 > grep.txt
最终文件应该包含所有可能的 ID (rs.....),这些 ID 在两个文件中都具有相同的坐标。
【问题讨论】:
-
在您的示例数据中,
file2中的任何rs值均不适用于file1 -
第二个文件很小,很容易放入 RAM。我推荐 perl 来完成这项任务,但同样的方法适用于任何语言。 1. 将第二个文件读入关联数组 2. 遍历大文件中的行,将每一行拆分为列。对于关联数组中存在 ID 列的每一行,打印该行。在 perl 中,即使您不使用 trailing-if 习惯用法,这也将是大约 7 或 8 行代码。
-
您可以使用 GNU awk 或使用 sqlite 编写您的 C 程序或 C++ 程序,或者考虑使用 PostGreSQL。也许 32GB 的 RAM 可能有用。顺便说一句,您的任务可能与RefPerSys 相关——通过电子邮件与我联系
basile@starynkevitch.net,但请提及您问题的 URL,并提供几段书面英语来解释细节和上下文。我不知道什么是HG19