【问题标题】:Is there any way to find common rows between two files where one file has two column and other has 1 column? Files are huge, cannot work in R有没有办法找到两个文件之间的共同行,其中一个文件有两列,另一个文件有 1 列?文件很大,不能在 R 中工作
【发布时间】: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

标签: linux grep


【解决方案1】:

这将输出每个文件的 ID,例如:rs11234969.txt、rs372076.txt 等。每个文件都包含文件 one.txt 格式的坐标和 ID

#!/bin/bash

while read line
do
    awk -v line=$line '{if($2==line)print $0}' one.txt >${line}.txt
done <two.txt

【讨论】:

    【解决方案2】:

    看起来坐标中没有任何 ID 特征。所以你自己的方法相当接近,我只是建议一个小的改变。

    grep -f file2 file1 > new_file
    

    问题是您真的不想使用具有 3 亿行的文件作为模式文件,首先是因为它具有永远不会匹配的额外数据(坐标),但是也因为它的大小。

    【讨论】:

      【解决方案3】:

      这是纠正错误的命令:

      grep -wnF -f file2.txt file1.txt > grep.txt
      

      输出将包含文件file1.txt 中的行号,后跟一个冒号和相应的行。

      请注意,这要求file2.txt 不包含空白行,并且这些行不被空格或其他空白/隐藏符号包围。 如果上述某些条件不成立,请使用以下内容:

      sed 's/^[ \t]*\([^ \t]*\)[ \t]*$/\1/; /^[ \t]*$/d' file2.txt | \
        grep -wnF -f /dev/stdin file1.txt > grep.txt
      

      【讨论】:

        猜你喜欢
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2019-12-04
        • 2023-03-27
        相关资源
        最近更新 更多