在UNIX中查找作为命令行输入的单词出现的次数

时间:2019-03-03 09:52:10

标签: unix command-line grep

对于其中包含的文件file1.txt

Apple fruit Apple tree
Tree AApple AApklle Apple apple
TREE
Apple

我想找到单词Apple的出现次数。输出应为4
我的script.sh文件包含

#!/bin/bash
FILE="$1"
TOFIND="$2"
if [ -f "$FILE" ];
then
grep -o '\<"$TOFIND"\>' "$FILE" | wc -l
fi

当我尝试使用

bash script.sh file1.txt Apple

输出显示0。请帮助解决此问题。

3 个答案:

答案 0 :(得分:1)

awk中的一个:

$ awk -v w="Apple" 'BEGIN{RS="( |\n)+"}{c+=($1==w)}END{print c}' file
4

解释:

$ awk -v w="Apple" '     # search word as parameter
BEGIN {
    RS="( |\n)+"         # set record separator to separate words
    # RS="[[:space:]]+"  # where available
}{
    c+=($1==w)           # count searched words
}
END {                    # in the end
   print c+0             # output count
}' file

RS="( |\n)+"经过测试可在gawk,mawk和Busybox awk上运行,但无法在Debian的原始awk上运行。 RS="[[:space:]]+"经测试仅适用于gawk。

答案 1 :(得分:1)

使用GNU awk进行多字符RS:

$ awk -v RS='\\<Apple\\>' 'END{print (NR ? NR-1 : 0)}' file
4

或带有shell变量:

$ tofind='Apple'
$ awk -v RS='\\<'"$tofind"'\\>' 'END{print (NR ? NR-1 : 0)}' file
4

答案 2 :(得分:0)

您可以将grep行更改为:

grep -o '\<'"$TOFIND"'\>' "$FILE" | wc -l

或者只是:

grep -o "\<$TOFIND\>" "$FILE" | wc -l

然后它将起作用。这是因为双引号,双引号都在单引号内引起来,所以它们不会扩展。