来自外部 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
行处理第一个文件,将该文件中的名称读入数组中,想象一下,names
。 next
表示在读取第一个文件 (names.txt
) 时不处理其余代码。
一个代码正在读取第二个文件,FNR
(文件记录数)不再等于NR
(总记录数),因此跳过第一行。该操作处理来自 report.csv
的行。您没有展示如何处理 CSV material,这很好 — 您说您将名称加载到 name
。 if
语句检查 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… }
}
请注意,此编码方案允许同名同时具有好坏之分。你可以决定,即使人们也被列为坏人,也应该将他们视为好人,反之亦然。如果您愿意,您甚至可以检查好名单和坏名单之间是否没有重复。
目前我有一个包含 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
行处理第一个文件,将该文件中的名称读入数组中,想象一下,names
。 next
表示在读取第一个文件 (names.txt
) 时不处理其余代码。
一个代码正在读取第二个文件,FNR
(文件记录数)不再等于NR
(总记录数),因此跳过第一行。该操作处理来自 report.csv
的行。您没有展示如何处理 CSV material,这很好 — 您说您将名称加载到 name
。 if
语句检查 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… }
}
请注意,此编码方案允许同名同时具有好坏之分。你可以决定,即使人们也被列为坏人,也应该将他们视为好人,反之亦然。如果您愿意,您甚至可以检查好名单和坏名单之间是否没有重复。