我想打印文件1中的所有行,其中在文件2的$ 1和$ 4中找到了$ 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

最佳答案

我可以通过将第二列和第三列收集在单独的哈希中来做到这一点,例如:

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

关于arrays - 如何使用awk打印具有多个关联数组和条件的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49701483/

10-12 13:14