【问题标题】:Fastest way to find lines of a file based on column from another larger file in awk根据 awk 中另一个较大文件的列查找文件行的最快方法
【发布时间】:2022-01-12 00:26:00
【问题描述】:

我有输入文件(1.csv),大约有 0.5M 行,多个 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[$1]; next
 }
 {
    for (i in hash) if (match($0,i)) {print; break}
 }' 1.csv FS=',' CLEANUP_BC_*

预期输出:

猫 1.csv

 15192151898, 732539481
 12042050161, 770565711

猫 2.csv

 12042050198, 592494702
 12042050158, 765193222

【问题讨论】:

  • 1.csv 是输入文件 AND 是输出文件吗?
  • 文件是否包含前导空格?如果没有,请删除它们。

标签: awk


【解决方案1】:

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

命令:(我认为代码解释了自己)

awk -F',' ' fname != FILENAME{fname=FILENAME;idx++}
    idx == 1 {a[$1]}
    idx>1 && $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

【讨论】:

  • 完美工作,因为输入记录中没有前导和尾随空格。非常感谢帮助!。
  • @EdMorton 谢谢。你说的对!我将在答案中更改&gt;。并添加 close() 语句以防有很多输入文件。
猜你喜欢
  • 2017-07-03
  • 2023-01-03
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 2018-08-22
相关资源
最近更新 更多