【问题标题】:How to print lines with multiple associative arrays and conditions using awk如何使用 awk 打印具有多个关联数组和条件的行
【发布时间】:2018-09-16 23:52:51
【问题描述】:

我想打印文件 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

Desired output 只打印文件 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

【问题讨论】:

    标签: arrays awk associative-array


    【解决方案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] 想要的输出
    • @user3146560:您还应该包括“存在”检查。查看我的编辑
    • 雷神,我想我理解您的编辑($1 SUBSEP $4 in g)的意思,但是您能评论(或拼出)命令的每个元素在做什么吗?
    • @user3146560: $1 SUBSEP $4 是这三个元素的串联,与哈希寻址中使用的键相同,例如。 g[$1,$4]in g 测试该特定键是否在 g 哈希中。
    猜你喜欢
    • 1970-01-01
    • 2019-01-11
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多