unix - 根据文件 1 UNIX 中单个列的公共(public)值对文件 2 的行进行子集

标签 unix awk grep comm

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

例如,在 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 个模式。

有什么想法吗?

最佳答案

$ 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

关于unix - 根据文件 1 UNIX 中单个列的公共(public)值对文件 2 的行进行子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23703766/

相关文章:

grep - 如何检查 Ansible 的命令输出中是否存在字符串列表?

date - date +%s 结果是本地时区还是UTC?

java - 监控unix机器性能计数器的命令

unix - Powershell与UNIX

shell - 如果文件编码为 utf-16le,则获取垃圾字符

perl - 循环 - 提取记录文本直到下一条记录

regex - SunOS - (Bash) Grep 命令从不包含模式的匹配中获取行

bash - 如何在 Bash 中使用正负索引获取子字符串

python - 以 Unix 方式总结两列

linux - 如何使用grep从txt文件中获取大于50的数字