【问题标题】:Get lines from file that match strings in another file using AWK使用 AWK 从文件中获取与另一个文件中的字符串匹配的行
【发布时间】:2015-09-16 10:34:44
【问题描述】:

我有一个名为 key 的文件和另一个名为 val.csv 的 csv 文件。可以想象,名为key 的文件看起来像这样:

123
012
456

名为val.csv 的文件有多个列和对应的值。它看起来像这样:

V1,V2,V3,KEY,V5,V6
1,2,3,012,X,t
9,0,0,452,K,p
1,2,2,000,L,x

我想从val.csv 获取其KEY 列中的值与KEY 文件中的值匹配的行子集。使用上面的例子,我想得到这样的输出:

V1,V2,V3,KEY,V5,V6
1,2,3,012,X,t

显然,这些只是玩具示例。我使用的真正的KEY 文件有近500,000 个“键”,val.csv 文件中有近500 万行。谢谢。

【问题讨论】:

    标签: csv hash awk key


    【解决方案1】:
    $ awk -F, 'FNR==NR{k[$1]=1;next;} FNR==1 || k[$4]' key val.csv 
    V1,V2,V3,KEY,V5,V6
    1,2,3,012,X,t
    

    工作原理

    • FNR==NR { k[$1]=1;next; }

      这会保存从第一个文件 key 读取的所有键的值。

      条件是FNR==NRFNR 是到目前为止从当前文件读取的行数,NR 是读取的总行数。因此,如果FNR==NR,我们仍在读取第一个文件。

      读取第一个文件key时,这会将key的值保存在关联数组k中。然后,这会跳过其余命令并从 next 行重新开始。

    • FNR==1 || k[$4]

      如果我们到达这里,我们正在处理第二个文件。

      对于文件的第一行 FNR==1 或第四个字段在数组 k 中的行,此条件为真。如果条件为真,awk 执行默认操作,即打印该行。

    【讨论】:

    • 完美运行。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2014-01-20
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2011-04-26
    • 2020-03-25
    相关资源
    最近更新 更多