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

标签 csv hash awk key

我有一个名为 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 万行。谢谢。

最佳答案

$ 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;下一个; }

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

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

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

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

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

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

关于csv - 使用 AWK 从文件中获取与另一个文件中的字符串匹配的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31124564/

相关文章:

javascript - Highcharts 错误 csv.replace 不是函数

perl hashref/perl 语法

ruby - 解析哈希以打印为格式良好的字符串

python - 删除数百万个压缩 CSV 文件中的重复行,同时保留重复行中的一条信息

unix - 如何在 unix 上使用行号从文件中提取行?

awk - 如何抑制 (g)awk 兼容性警告?

bash - 使用 bash 删除子域

php - 将数据从 CSV 文件插入到现有表中

python - 数据帧结构操作

python - 无法使用 file.write 将数据帧写入 python 中的 .csv 文件