首页 > 解决方案 > awk 哈希对两个输入文件应用条件

问题描述

我正在尝试使用 比较两个文件awk,我想根据三个条件将它们组合起来。

  1. 第 2 列等于第 1 列
  2. 第 3 列大于或等于第 2 列
  3. 第 3 列小于或等于第 3 列

文件如下所示:

文件 1

snp1 14 6371334
snp2 14 7928189
snp3 14 31819743
snp4 14 62133529
snp5 14 62616434
snp6 14 17544926
snp7 14 31639444

文件2

14 71159186 72228540 31
14 15732809 16677121 68
14 45003977 46299534 69
14 61965465 64286878 128
14 17378950 17833828 141
14 12877549 13217565 193
14 31369019 31785149 194
14 49883707 49905143 197

期望的输出是:

snp1 14 6371334 0 
snp2 14 7928189 0
snp3 14 31819743 0
snp4 14 62133529 128
snp5 14 62616434 128
snp6 14 17544926 141
snp7 14 31639444 194

我试过这个:

awk 'NR==FNR {a[$1]=$1;b[$2]=$2;c[$3]=$3;d[$4]=$4;next} {if($2 in a && $3 >= b[$2] && $3 <= c[$3]) print $1,$2,$3,d[$4]}' file2 file1

但它不是那样工作的。

有什么帮助吗?

谢谢!

标签: unixawk

解决方案


看起来您可能想为 snp 分配一个间隔
,即如果一个 snp 在某个间隔内,则
报告与该间隔关联的标识符。

几乎我不喜欢看到的事情包括在NR==FNR没有相应模式的情况下使用NR!=FNR模式。

这个想法是四个单独的数组,其中每个键都是其值的副本
......你能用它做什么?
无论如何,同一行中的任何项目都不会因偶然保存而相互关联。

并不是说你应该这样做......
但你可能认为使用以下构造会更好地服务:

a[NR]=$1;b[NR]=$2 ....

在同一行相关的项目可以恢复

第一个块中的尾随;next可能无济于事
,因为 awk 的自然行为是在不被告知的情况下继续进行。

第二个块尚未包含 awk 的本质......
条件在块之前的隐式 if

就像是

NR != FNR && $1 in a   ... {print ...

如果可能,您通常希望首先使用小得多的文件,然后通过第二个文件进行流式传输,尤其是在第二个文件大得多的情况下。

注意:您的样本似乎有未被利用的订单

大纲可能看起来像

read file1 into array(s) maintaining order

process first item from file1 through file2 until  
 found OR not exists is determined.

proceed to process next item from file1 (continuing from where you are in file2)
rinse & repeat

我可以为你做你的工作,但考虑到
提出的一些观点,你最好自己再试一次.


推荐阅读