目前我有一个包含4个文件的文件夹,一个script.awk
脚本文件,运行脚本的gawk.exe
二进制文件和一个report.csv
文件,其中脚本从中读取行,以及一个names.txt
文件,其中包含用户名,每行一个。有时名称包含空格,因此有时候它们实际上是两个或多个单独的单词,但txt文件中每行只有一个用户名。当我运行我的awk脚本时,我将csv文件中的一些数据存储在名为" name"的变量中。
现在让我们说名字=" Pete",我想检查names.txt
文件是否包含用户名Pete,它必须是&# 34; Pete",不喜欢" Pete Sampras"等,当发现比赛时,我想明显采取进一步行动。
txt文件包含大约500行,如下所示:
leopanato
colan321
kamon mdp
BELLAM42
答案 0 :(得分:2)
将名称读入数组,然后使用:
gawk -f script.awk names.txt report.csv
和script.awk
可能包含:
FNR == NR { names[$0]++; next }
{
…code to determine name…
if (name in names)
{
…actions for matched name…
}
}
FNR == NR
行处理第一个文件,将该文件中的名称读入名为imagiletively names
的数组中。 next
表示在读取第一个文件(names.txt
)时不处理其余代码。
一个代码正在读取第二个文件,FNR
(文件记录号)不再等于NR
(总记录号),因此跳过第一行。该操作处理来自report.csv
的行。您没有展示如何处理CSV素材,这很好 - 您说您在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[$0]++; next }
FILENAME == ARGV[2] { bad[$0]++; next }
{
…code to determine name…
if (name in good) { …actions for good names… }
if (name in bad) { …actions for bad names… }
}
请注意,此编码方案允许同一个名称既好又坏。你可以决定人们应该被视为好,即使他们也被列为坏人,反之亦然。如果你愿意,你甚至可以检查好的和坏的列表之间没有重复。