我有一个文件,list.txt
其中包含单词列表。我想检查每个单词在另一个文件中出现的次数file1.txt
,然后输出结果。所有数字的简单输出就足够了,因为我可以list.txt
使用电子表格程序手动添加它们,但如果脚本在每行末尾添加数字list.txt
,那就更好了,例如:
bear 3
fish 15
我试过这个,但它不起作用:
cat list.txt | grep -c file1.txt
您可以在一个循环中执行此操作,该循环一次从单词列表文件中读取一个单词,然后计算数据文件中的实例。例如:
while read; do
echo -n "$REPLY "
fgrep -ow "$REPLY" data.txt | wc -l
done < <(sort -u word_list.txt)
“秘方”包括:
这个 awk 方法只需要遍历每个文件一次:
awk '
# read the words in list.txt
NR == FNR {count[$1]=0; next}
# process file1.txt
{
for (i=0; i<=NF; i++)
if ($i in count)
count[$i]++
}
# output the results
END {
for (word in count)
print word, count[word]
}
' list.txt file1.txt
这可能对您有用(GNU sed):
tr -s ' ' '\n' file1.txt |
sort |
uniq -c |
sed -e '1i\s|.*|& 0|' -e 's/\s*\(\S*\)\s\(\S*\)\s*/s|\\<\2\\>.*|\2 \1|/' |
sed -f - list.txt
解释:
file1.txt
成单词sed
脚本来匹配单词(最初将每个单词归零)list.txt
单行命令
cat file1.txt |tr " " "\n"|sort|uniq -c |sort -n -r -k 1 |grep -w -f list.txt
命令的最后一部分告诉 grep 从列表中读取要匹配的单词(-f 选项),然后匹配整个单词(-w),即如果 list.txt 包含汽车,grep 应该忽略回车。
但是请记住,您对整个单词的看法和 grep 的看法可能不同。例如。虽然 car 不会与carriage 匹配,但会与 car-wash 匹配,注意单词边界会考虑“-”。grep 将除字母、数字和下划线之外的任何内容作为单词边界。这应该不是问题,因为这符合英语单词的公认定义。