根据awk中另一个较大文件的列查找文件行的最快方法

Fastest way to find lines of a file based on column from another larger file in awk

我有输入文件 (1.csv),大约有 500 万行,CLEANUP_BC_[1-10].csv 的多个文件大约有 1000 万行。 1.csv 每行有一个字段 f1,而 CLEANUP_BC_[1-10].csv 有 2 个字段,f1 到 f2,由 ,.

分隔

我想从 1.csv 中找到所有行,其中 1.scv 的 f1 与 CLEANUP_BC_[1-10].csv 的 f1 匹配,如果匹配则根据 CLEANUP_BC_[1-10].csv文件F2栏最后一位.

猫1.csv

15192151898
11000000012
11000000019
11000000077
12042050006
12042050053
12042050158
12042050161
12042050178
12042050198

CLEANUP_BC_1.csv

 15192151898, 732539481
 16133029583, 707751921
 16133636489, 540841871
 16476205207, 770565711
 16132823434, 459659751
 12363335422, 889809091
 14372484755, 739320471
 12368188419, 732539481
 12042050161, 770565711
 17807200578, 744517871

CLEANUP_BC_2.csv

 12042050198, 592494702
 16134492706, 739754232
 12363321831, 747588192
 19053343880, 432742682
 12262185649, 779803212
 16047157202, 888743762
 19054607842, 789457272
 12505168454, 138011622
 14372156219, 781262852
 12042050158, 765193222

脚本:

awk 'FNR==NR{
 hash[]; next
 }
 {
    for (i in hash) if (match([=13=],i)) {print; break}
 }' 1.csv FS=',' CLEANUP_BC_*

预期输出:

猫1.csv

 15192151898, 732539481
 12042050161, 770565711

猫2.csv

 12042050198, 592494702
 12042050158, 765193222

这是一个典型的awk多文件处理问题。

命令:(我认为代码本身就说明了)

awk -F',' ' fname != FILENAME{fname=FILENAME;idx++}
    idx == 1 {a[]}
    idx>1 &&  in a{print > (fname".out")} ' 1.csv C_*.csv

注:

  • 我用gawk测试过
  • 我稍微简化了你的文件名。 C_*.csv你可以用真实的图案替换它
  • 您的 CLEAN_*.csv 文件每行都有前导空格。我已经删除了它们。如果您的输入数据确实包含这些空格,我们需要对其进行处理。这很简单,但我想空格来自您的复制和粘贴。
  • 在你运行命令之后,你会得到10个(如果有10个CLEANUP_..csv文件,如你所说CLEANUP_....csv.out包含匹配行的文件
  • 如果您有很多输入文件,您可能需要在切换到新的输入文件之前调用 close(fname".out")。或者您可能会收到类似“打开的文件太多”错误消息。

如果我 运行 使用你的简短示例,我得到:

kent$  head *.out
==> C_1.csv.out <==
15192151898, 732539481
12042050161, 770565711

==> c_2.csv.out <==
12042050198, 592494702
12042050158, 765193222