【发布时间】: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 中的条目数量很大,则grep与awk等工具中基于哈希的匹配相比会更慢 -
@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 很快就完成了这项工作。