外部txt文件中的awk模式

时间:2015-09-11 05:06:48

标签: file awk external gawk

目前我有一个包含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

1 个答案:

答案 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… }
}

请注意,此编码方案允许同一个名称既好又坏。你可以决定人们应该被视为好,即使他们也被列为坏人,反之亦然。如果你愿意,你甚至可以检查好的和坏的列表之间没有重复。