使用 AWK 从文件中获取与另一个文件中的字符串匹配的行
Get lines from file that match strings in another file using AWK
我有一个名为 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 'keys',而 val.csv
文件有将近 500 万行。谢谢。
$ awk -F, 'FNR==NR{k[]=1;next;} FNR==1 || k[]' key val.csv
V1,V2,V3,KEY,V5,V6
1,2,3,012,X,t
工作原理
FNR==NR { k[]=1;next; }
这会保存从第一个文件 key
.
中读取的所有键的值
条件为FNR==NR
。 FNR
是到目前为止从当前文件读取的行数,NR
是读取的总行数。因此,如果 FNR==NR
,我们仍在读取第一个文件。
当读取第一个文件key
时,这会将key的值保存在关联数组k
中。然后这将跳过其余命令并从 next
行重新开始。
FNR==1 || k[]
如果我们到达这里,我们正在处理第二个文件。
对于文件的第一行 FNR==1
或第四个字段在数组 k
中的行,此条件为真。如果条件为真,awk 执行默认操作,即打印该行。
我有一个名为 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 'keys',而 val.csv
文件有将近 500 万行。谢谢。
$ awk -F, 'FNR==NR{k[]=1;next;} FNR==1 || k[]' key val.csv
V1,V2,V3,KEY,V5,V6
1,2,3,012,X,t
工作原理
FNR==NR { k[]=1;next; }
这会保存从第一个文件
中读取的所有键的值key
.条件为
FNR==NR
。FNR
是到目前为止从当前文件读取的行数,NR
是读取的总行数。因此,如果FNR==NR
,我们仍在读取第一个文件。当读取第一个文件
key
时,这会将key的值保存在关联数组k
中。然后这将跳过其余命令并从next
行重新开始。FNR==1 || k[]
如果我们到达这里,我们正在处理第二个文件。
对于文件的第一行
FNR==1
或第四个字段在数组k
中的行,此条件为真。如果条件为真,awk 执行默认操作,即打印该行。