【问题标题】:Subsetting GWAS results by matching snp column from another file通过匹配来自另一个文件的 snp 列子集 GWAS 结果
【发布时间】:2021-06-17 09:11:18
【问题描述】:

我有一个 GWAS 汇总估算文件,其中包含以下列(文件 1):

1   chr1_1726_G_A      0.023  0.160
1   chr1_20184_GAATA_G 0.033  0.180
1   chr1_791101_T_TGG  0.099  0.170

文件 2

chr1_20184_GAATA_G
chr1_791101_T_TGG

我想将文件 2 的列 1 与文件 1 的列 2 相匹配,以创建一个 文件 3,例如:

1   chr1_20184_GAATA_G 0.033  0.180
1   chr1_791101_T_TGG  0.099  0.170

通过使用下面的代码,我得到一个空的 file3

awk 'FNR==NR{arr[$2];next} (($2) in arr)' file2 file1 > file3

【问题讨论】:

  • 为什么不fgrep?在我看来,它是这种过滤器的专用工具。
  • @Zilog80 使用grep 进行基于字段的处理是很棘手的。即使假设像chr1_2018 这样的内容只能出现在第二个字段中,您仍然需要添加条件以避免部分匹配(例如:chr1_2018 不应匹配具有chr1_2018a 的字段)。如果文件 2 中的条目数量很大,则 grepawk 等工具中基于哈希的匹配相比会更慢
  • @Zilog80 fgrep 已弃用,取而代之的是 grep -F 并且在特定字段中使用任何 *grep 比仅使用 awk 更麻烦,因为 grep 是面向行的,而 awk 是记录- 面向现场。当您想要进行字符串匹配时尤其如此,因为 grep 必须使用正则表达式来隔离字段,因此您必须转义用于匹配的文本中的每个正则表达式元字符以尝试获取它就好像它是一个字符串一样。非常杂乱无章。
  • @AVA 计算file2 中每行有多少字段。这只是1个字段,对吗?现在查看读取 file2 (FNR==NR{arr[$2]...) 的代码。它试图使用每行有 1 个字段的文件的字段 2。想一想。
  • 感谢以上讨论。 sed 's/.*/\t&\t/'文件的使用2.txt | grep -F -f - file.txt 很快就完成了这项工作。

标签: awk gwas


【解决方案1】:

使用您展示的示例,请尝试关注awk 代码。

awk 'FNR==NR{arr[$0];next} ($2 in arr)' file2 file1

awk 'FNR==NR{arr[$1];next} ($2 in arr)' file2 file1

说明: 对数组使用 $0(在第一个解决方案中)或 $1(在 OR 解决方案中)而不是在第一个块中使用 $2,然后其余代码就可以了匹配;在此处匹配记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2021-08-31
    • 2021-11-03
    • 2015-09-19
    • 2021-10-01
    相关资源
    最近更新 更多