当前位置: 首页 > 面试题库 >

从bash中的文件计算单词出现

云飞翮
2023-03-14
问题内容

对于这个新手问题,我感到很抱歉,但是我对bash编程还是有点陌生(从几天前开始)。基本上我想做的是保留一个文件,并保留另一个文件的所有单词出现

我知道我可以这样做:

sort | uniq -c | sort

事情是,在那之后,我想获取第二个文件,再次计算出现次数并更新第一个文件。之后,我取第三份文件,依此类推。

我在做什么,此刻工作没有任何问题(我使用grepsedawk),但它看起来相当缓慢。

我很确定使用uniq,仅使用命令就可以有一种非常有效的方法,但是我不知道。

你能带我走正确的路吗?

我还粘贴了我编写的代码:

#!/bin/bash
#   count the number of word occurrences from a file and writes to another file #
#   the words are listed from the most frequent to the less one                 #

touch .check                # used to check the occurrances. Temporary file
touch distribution.txt      # final file with all the occurrences calculated

page=$1             # contains the file I'm calculating
occurrences=$2          # temporary file for the occurrences

# takes all the words from the file $page and orders them by occurrences
cat $page | tr -cs A-Za-z\' '\n'| tr A-Z a-z > .check

# loop to update the old file with the new information
# basically what I do is check word by word and add them to the old file as an update
cat .check | while read words
do
    word=${words}       # word I'm calculating
    strlen=${#word}     # word's length
    # I use a black list to not calculate banned words (for example very small ones or inunfluent words, like articles and prepositions
    if ! grep -Fxq $word .blacklist && [ $strlen -gt 2 ]
    then
        # if the word was never found before it writes it with 1 occurrence
        if [ `egrep -c -i "^$word: " $occurrences` -eq 0 ]
        then
            echo "$word: 1" | cat >> $occurrences
        # else it calculates the occurrences
        else
            old=`awk -v words=$word -F": " '$1==words { print $2 }' $occurrences`
            let "new=old+1"
            sed -i "s/^$word: $old$/$word: $new/g" $occurrences
        fi
    fi
done

rm .check

# finally it orders the words
awk -F": " '{print $2" "$1}' $occurrences | sort -rn | awk -F" " '{print $2": "$1}' > distribution.txt

问题答案:

好吧,我不确定您要尝试执行的操作是否正确,但是我可以这样进行:

while read file
do
  cat $file | tr -cs A-Za-z\' '\n'| tr A-Z a-z | sort | uniq -c > stat.$file
done < file-list

现在,您有了所有文件的统计信息,现在可以简单地对其进行汇总:

while read file
do
  cat stat.$file
done < file-list \
| sort -k2 \
| awk '{if ($2!=prev) {print s" "prev; s=0;}s+=$1;prev=$2;}END{print s" "prev;}'

用法示例

$ for i in ls bash cp; do man $i > $i.txt ; done
$ cat <<EOF > file-list
> ls.txt
> bash.txt
> cp.txt
> EOF

$ while read file; do
> cat $file | tr -cs A-Za-z\' '\n'| tr A-Z a-z | sort | uniq -c > stat.$file
> done < file-list

$ while read file
> do
>   cat stat.$file
> done < file-list \
> | sort -k2 \
> | awk '{if ($2!=prev) {print s" "prev; s=0;}s+=$1;prev=$2;}END{print s" "prev;}' | sort -rn | head

3875 the
1671 is
1137 to
1118 a
1072 of
793 if
744 and
533 command
514 in
507 shell


 类似资料:
  • 问题内容: 计算单词在文件中出现的次数的简便方法是什么? 问题答案: 这还将在单行中计算单词的多次出现:

  • 问题内容: 我有一个重复条目的单词。 我想计算并保存数据结构中每个单词的出现次数。 我该怎么做? 问题答案: 如果您没有大量的字符串,最短的实现方法是使用方法,如下所示: 输出:

  • 问题内容: 这应该将行数,单词数和字符数计入文件中。 但这是行不通的。从输出中仅显示。 码: 我不明白发生了什么事。有什么建议? 问题答案: 不同的方法。使用字符串查找行数,单词数和字符数: 注意: 对于其他编码样式,请使用代替。 是需要设置的字符。引用这个和维基

  • 问题内容: 我有一个具有以下格式的.txt文件, 尽管显然它要大得多,但实际上是这样。基本上,我试图总结每个单独字符串在文件中的次数(每个字母/字符串在单独的一行上,因此从技术上讲文件是C \ nV \ nEH \ n等。但是,当我尝试将这些文件转换为列表,然后使用count函数时,它会分离出字母,以使诸如’IRQ’之类的字符串为[‘\ n’I’,’R’ ,’Q’,’\ n’],这样当我计算它时,

  • 我试图使用java中的hadoop mapreduce编程计算文件中出现的<b>特定(输入、输出、单词)。但我无法找到一种方法将单词传递给map函数。我尝试了以下方法,但没有成功:-在mapper类中创建了一个静态字符串变量,并将第三个参数(即要搜索的单词)的值分配给它。然后尝试在map函数中使用这个静态变量。但在map函数中,静态变量值为空。我无法在map函数中获得第三个arment的值。 有办

  • 问题内容: 我有一个大的文本文件正在读取,因此我需要找出几个单词出现的次数。例如,单词。我正在逐行执行此操作,每一行都是一个字符串。 我要确保我只算合法的-在中起不到作用。这意味着我知道我需要以某种方式使用正则表达式。到目前为止,我正在尝试的是: 我意识到正则表达式目前可能不正确,但我尝试过不这样做,而只是尝试查找单词的出现,并且我也得到了错误的数字。我给人的印象是,它将字符串分割成一个数组,并且