根据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
我有输入文件 (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