【问题标题】:Counting the appearances of a word in a text file in bash在 bash 中计算文本文件中单词的出现次数
【发布时间】:2021-11-15 14:26:28
【问题描述】:

我想计算文件中每个单词的出现次数。我不会计算一个单词是否作为另一个单词中的子字符串存在。例如,如果这个词是“in”,我不想将“inside”算作脱离世界的外观。

从我使用的文本文件中获取单词:

#Stores the words of the file without duplicates
WORDS=`grep -o -E '\w+' $1 | sort -u -f`

获取已作为命令行参数传递的文件的所有单词。

然后我用下面的命令来统计每个单词出现的次数:

#Accessing all the words from the file
for WORD in $WORDS
do
    #Number of apperences of the WORD in the text file ($1)
    APEARENCES=`grep -o -i "$WORD" $1 | wc -l`

    ***Code***
done

我的问题是APEARENCES=`grep -o -i "$WORD" $1 | wc -l` 也会计算一个单词的子字符串,如果它与"$WORD" 的字符串匹配。它将“inside”视为单词“in”的出现。

编辑:我找到了解决方案。结果我只需要在表达式中添加-w

APEARENCES=`grep -o -i -w "$WORD" $1 | wc -l`

【问题讨论】:

  • “单词”是如何定义的?用换行符替换所有非单词字符,删除空换行符,然后排序 -u |独特的-c。用 shellcheck 检查你的脚本。不要使用反引号。
  • 您可以在 grep 中添加单词分隔符(例如空格)
  • 使用awk肯定会更容易
  • 你们能提供一些例子吗?我对 bash 脚本非常陌生。我几天前才开始

标签: bash bash-completion


【解决方案1】:

grep 有-w 来匹配整个单词。 uniq-c 打印计数。

grep -Eow '\w+' myfile | sort | uniq -c | sort -nk 1,1

打印myfile 中词频的排序列表。

使用uniq -i(不是posix),也可以忽略大小写:

grep -Eow '\w+' | sort -f | uniq -ic | sort -nk 1,1

【讨论】:

    【解决方案2】:

    您可以使用单词边界(\\b):

    $ cat text.txt

    “inside”作为单词“in”的外观

    $ grep in text.txt

    in侧面作为单词“in”的外观

    $ grep \\bin\\b text.txt

    "inside 作为单词的外观"in"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多