来自外部 txt 文件的 awk 模式

awk pattern from external txt file

目前我有一个包含 4 个文件的文件夹,一个 script.awk 脚本文件,gawk.exe 二进制文件 运行 脚本和一个 report.csv 文件从中读取行的脚本,以及一个包含用户名的 names.txt 文件,每行一个。有时名称包含空格,因此有时它们实际上是两个或多个单独的词,但在 txt 文件中每行严格有一个用户名。当我 运行 我的 awk 脚本时,我将 csv 文件中的一些数据存储在一个名为 "name".

的变量中

现在假设 name = "Pete",我想检查 names.txt 文件是否包含用户名 Pete,它必须正好是 "Pete",而不是比如 "Pete Sampras" 等,当找到匹配项时,我显然想采取进一步的行动。

txt 文件包含大约 500 行,如下所示:

leopanato
colan321
kamon mdp
BELLAM42

基本问题

将名称读入数组,然后使用:

gawk -f script.awk names.txt report.csv

script.awk可能包含:

FNR == NR { names[[=11=]]++; next }
{
    …code to determine name…
    if (name in names)
    {
       …actions for matched name…
    }
}

FNR == NR 行处理第一个文件,将该文件中的名称读入数组中,想象一下,namesnext 表示在读取第一个文件 (names.txt) 时不处理其余代码。

一个代码正在读取第二个文件,FNR(文件记录数)不再等于NR(总记录数),因此跳过第一行。该操作处理来自 report.csv 的行。您没有展示如何处理 CSV material,这很好 — 您说您将名称加载到 nameif 语句检查 name 中的值是否是数组 names 中的索引。如果是,则执行适当的操作。

扩展问题

您可以查看 ARGV 数组和 length(ARGV) 以及 FILENAME 来推断您正在处理的内容。调整代码:

BEGIN { if (length(ARGV) != 4) { printf "Usage: %s good.txt bad.txt records.csv\n", ARGV[0]; exit(1) } }
FILENAME == ARGV[1] { good[[=12=]]++; next }
FILENAME == ARGV[2] { bad[[=12=]]++; next }
{
    …code to determine name…
    if (name in good) { …actions for good names… }
    if (name in bad)  { …actions for bad  names… }
}

请注意,此编码方案允许同名同时具有好坏之分。你可以决定,即使人们也被列为坏人,也应该将他们视为好人,反之亦然。如果您愿意,您甚至可以检查好名单和坏名单之间是否没有重复。