【问题标题】:Subset rows of file 2 based on common values of single column in file 1 UNIX基于文件 1 UNIX 中单个列的公共值的文件 2 的子集行
【发布时间】:2014-05-16 20:09:26
【问题描述】:

我正在处理大型文件,我想只提取其中一列的值包含在另一个文件的列的值中的行。

例如,在 file1 中,我有 10,000 行看起来像这样:

Chr13998356 T   C
Chr1401532  A   G
Chr14021851 A   T

我在文件 2(100,000+ 行)中只想要文件 1 的第 1 列中存在第 1 列中的值的行。所以对于文件 2,我有:

Chr1    401530  G   G   60  0   60  11
Chr1    401531  A   A   60  0   60  11
Chr1    401532  A   G   30  170 60  11

我想得到第三个文件:

Chr1    401532  A   G   30  170 60  11

此文件的行数可能在几到 10,000 行之间。

在 R 中,我会使用 df3 <- df2[df2[,1] %in% df1[,2],] 之类的东西,但文件太大了。

有简单的 UNIX 解决方案吗?使用 comm 之类的东西,但只匹配第一列而不是整行将是完美的。或者使用 grep,但同时搜索 10K 模式。

有什么想法吗?

【问题讨论】:

  • 使用 data.table 包,这在 R 中也应该很快。

标签: unix awk grep comm


【解决方案1】:
$ cat file1
Chr13998356 T   C
Chr1401532  A   G
Chr14021851 A   T

$ cat file2
Chr1    401530  G   G   60  0   60  11
Chr1    401531  A   A   60  0   60  11
Chr1    401532  A   G   30  170 60  11

$ awk 'NR==FNR{vals[$1];next} ($1$2) in vals' file1 file2
Chr1    401532  A   G   30  170 60  11

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2021-09-02
    • 2014-07-12
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多