使用AWK从文件中获取与另一个文件中的字符串匹配的行

时间:2015-06-29 20:02:45

标签: csv hash awk key

我有一个名为var recursiveSwear = function(swear, times){ if(times == 1) return swear; else { console.log(swear); return recursiveSwear(swear, times - 1); } }; 的文件和另一个名为key的csv文件。可以想象,名为val.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 得到行的子集,其KEY列中的值与val.csv文件中的值匹配。使用上面的例子,我想获得这样的输出:

KEY

显然这些只是玩具的例子。我使用的真实V1,V2,V3,KEY,V5,V6 1,2,3,012,X,t 文件有近500,000个“密钥”,KEY文件中有近500万行。感谢。

1 个答案:

答案 0 :(得分:3)

$ 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时,这会在关联数组k中保存key的值。然后跳过其余的命令并从next行重新开始。

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

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

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