我正在尝试获取一个包含列表的文件,并计算该列表中的项目在目标文件中出现的次数。 像这样:
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
笔记:
由于
%d
,printf
语句强制将a[key]
转换为整数,以防它仍未设置。整个语句可以用更简单的print key, a[key]+0
代替。我在写答案时错过了这一点,但现在你知道做同样事情的两种方法了。;)在您的尝试中,出于某种原因,您只处理字段 2 (
$2
),忽略其他列。