我正在尝试获取一个包含列表的文件并计算该列表中的项目在目标文件中出现的次数。就像是:
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 但不包括在 target.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 语句读取 key.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 %d\n", 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
是否作为 key 出现在数组中
a
.如果是,则与该键关联的值(初始为零)递增。 END
,我们只打印 key
后跟出现次数 a[key]
和一个换行符( \n
)。输出:
blonde 2
red 0
black 0
笔记:%d
, printf
语句强制转换 a[key]
一个整数,以防它仍然未设置。整个语句可以替换为更简单的 print key, a[key]+0
.我在写答案时错过了这一点,但现在您知道做同一件事的两种方法。 ;)$2
),而忽略了其他列。关于linux - 使用 awk 计算另一个文件中模式出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64723154/