使用 awk 计算另一个文件中模式的出现次数



我正在尝试获取一个包含列表的文件,并计算该列表中的项目在目标文件中出现的次数。 像这样:

list.txt
blonde
red
black
target.txt
bob blonde male
sam blonde female
desired_output.txt
blonde 2
red 0
black 0

我选择了以下代码来获取 target.txt 中存在的值:

awk '{count[$2]++} END {for (word in count) print word, count[word]}' target.txt

但输出不包括 liist 中的所需项目.txt但不包括目标.txt

current_output.txt
blonde 2

我已经尝试了一些方法来使其正常工作,包括:

awk '{word[$1]++;next;count[$2]++} END {for (word in count) print word, count[word]}' list.txt target.txt

但是,我没有成功。

谁能帮我做,使这个awk语句读取密钥.txt文件? 对代码的任何解释也将不胜感激。 谢谢!

awk '
NR==FNR{a[$0]; next}
{
for(i=1; i<=NF; i++){
if ($i in a){ a[$i]++ }
}
}
END{
for(key in a){ printf "%s %dn", key, a[key] }
}
' list.txt target.txt
  • NR==FNR{a[$0]; next}条件NR==FNR仅适用于第一个文件,因此 数组a的键是list.txt行。

  • for(i=1; i<=NF; i++)现在对于第二个文件,这将遍历所有 它的领域。

    • if ($i in a){ a[$i]++ }这将检查字段$i是否作为键存在 在数组a中。如果是,则与该键关联的值(最初为零)将递增。
  • END,我们只打印key后跟出现次数a[key]和换行符(n)。

输出:

blonde 2
red 0
black 0

笔记:

  1. 由于%dprintf语句强制将a[key]转换为整数,以防它仍未设置。整个语句可以用更简单的print key, a[key]+0代替。我在写答案时错过了这一点,但现在你知道做同样事情的两种方法了。;)

  2. 在您的尝试中,出于某种原因,您只处理字段 2 ($2),忽略其他列。

最新更新