如何使用awk打印带有多个关联数组和条件的行

3
我想要打印出文件1中所有满足以下条件的行:$1和$4的值在文件2的$1和$4中找到,且文件1中$2的值大于或等于文件2中$2的值,文件1中$3的值小于或等于文件2中$3的值。

文件1

1   110201809   117658766   a
1   168095261   182305990   b
1   215456074   233436403   c
2   9465687     12905490    d
2   28765309    35235120    e
2   48958595    64702082    f

文件2

 1  245371026   249210707   a
 2  937388      46504962    h
 2  937388      162731186   b
 2  2954974     6777829     c
 2  9465687     12996275    d
 2  14539477    44757554    d
 2  14766820    30080818    m
 2  16531332    23584565    n
 2  17340076    26206255    o
 2  18535880    24452180    p
 2  28830071    35289330    q
 2  36206662    47273732    r
 2  48958495    64703082    f

期望的输出仅打印出符合条件的文件1中的行。

期望的输出

 2  9465687     12905490    d
 2  48958595    64702082    f

我尝试了以下方法,但是得到了一个空文件:
awk 'NR==FNR{ a[$1,$4]= $0; b[$2] = $2 ; c[$3] = $3; next }  ($1 $4 in a) && ($2 >= b[$2]) && ($3 <= c[$3])' file2 file1>desired output
1个回答

1

我会通过将第二列和第三列分别收集到不同的哈希表中来实现,例如:

parse.awk

NR==FNR { 
  g[$1,$4] = $2
  h[$1,$4] = $3
  next
} 

($1 SUBSEP $4 in g) && g[$1,$4] >= $2 && h[$1,$4] <= $3

像这样运行它:
awk -f parse.awk file1 file2

输出:

2  9465687     12996275    d
2  48958495    64703082    f

为了保持与我的初始问题一致,我使用Thor的解决方案提供了一行代码:awk 'NR==FNR { a[$1,$4] = $2; b[$1,$4] = $3; next} a[$1,$4] >= $2 && b[$1,$4] <= $3' file2 file1>desired output - user3146560
@user3146560:你还应该包括一个“存在性”检查。请看我的编辑。 - Thor
Thor,我认为我理解了你在编辑中的意思($1 SUBSEP $4 in g),但是你能否评论一下(或拼写出)命令的每个元素正在做什么? - user3146560
@user3146560: $1 SUBSEP $4 是这三个元素的连接,与哈希寻址中使用的键相同,例如 g[$1,$4]in g 测试该特定键是否在 g 哈希中。 - Thor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接