我有一个文件list.txt
,其中包含一个单词列表。我想检查每个单词出现在另一个文件file1.txt
中的次数,然后输出结果。所有数字的简单输出就足够了,因为我可以使用电子表格程序手动将它们添加到list.txt
,但如果脚本在list.txt
的每行末尾添加数字,那就是更好,例如:
bear 3
fish 15
我试过这个,但它不起作用:
cat list.txt | grep -c file1.txt
答案 0 :(得分:9)
您可以在循环中执行此操作,该循环一次从单词列表文件中读取单个单词,然后计算数据文件中的实例。例如:
while read; do
echo -n "$REPLY "
fgrep -ow "$REPLY" data.txt | wc -l
done < <(sort -u word_list.txt)
“秘密酱”包括:
答案 1 :(得分:4)
这个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
答案 2 :(得分:3)
这可能适合你(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
答案 3 :(得分:1)
单行命令
cat file1.txt |tr " " "\n"|sort|uniq -c |sort -n -r -k 1 |grep -w -f list.txt
命令的最后一部分告诉grep从列表中读取要匹配的单词(-f选项),然后匹配整个单词(-w),即如果list.txt包含car,则grep应该忽略car。
但请记住,您对整个单词和grep的观点的看法可能不同。例如。虽然汽车与马车不匹配,但它会与洗车相匹配,请注意&#34; - &#34;将被考虑用于字边界。 grep将除字母,数字和下划线之外的任何内容作为单词边界。这应该不是问题,因为这符合英语中单词的公认定义。