比较一组单词的出现次数

时间:2018-03-14 20:49:15

标签: linux bash shell unix grep

我有一个包含随机单词的文本文件。我想找出哪一个词最多出现在一对(' hi,你好' OR' Good,Bye')。

Simple.txt

hi there. hello this a dummy file. hello world. you did good job. bye for now.

我写了这个命令来得到每个单词的计数(嗨,你好,好,再见)。

cat simple.txt| tr -cs '[:alnum:]' '[\n*]' | sort | uniq -c|grep -E -i  "\<hi\>|\<hello\>|\<good\>|\<bye\>"

这给了我每个单词的出现,其中包含一个计数(它出现的次数)但是现在如何优化它并得到直接输出为&#34;你好/你好是最大出现的对和#34;

2 个答案:

答案 0 :(得分:3)

为了让它更有趣,让我们考虑一下这个测试文件:

$ cat >file.txt
You say hello.  I say good bye.  good bye. good bye.

要计算所有单词对:

$ awk -v RS='[[:space:][:punct:]]+' 'NR>1{a[last","$0]++} {last=$0} END{for (pair in a) print a[pair], pair}' file.txt
3 good,bye
1 say,good
2 bye,good
1 I,say
1 You,say
1 hello,I
1 say,hello

要获得具有最高计数的单对,我们需要排序:

$ awk -v RS='[[:space:][:punct:]]+' 'NR>1{a[last","$0]++} {last=$0} END{for (pair in a) print a[pair], pair}' file.txt | sort -nr | head -1
3 good,bye

如何运作

  • -v RS='[[:space:][:punct:]]+'

    这告诉awk使用空格或标点符号的任意组合作为记录分隔符。这意味着每个单词都成为记录。

  • NR>1{a[last","$0]++}

    对于第一个之后的每个单词,增加关联数组a中的计数,以用于前一个和当前工作的组合。

  • last=$0

    将当前单词保存在变量last

  • END{for (pair in a) print a[pair], pair}

    在我们读完输入后,打印出每对的结果。

  • sort -nr

    以反向(最高编号优先)顺序对输出进行数字排序。

  • head -1

    选择第一行(给我们最高计数的一对)。

多行版本

对于那些喜欢将代码分散在多行中的人:

awk -v RS='[[:space:][:punct:]]+' '
    NR>1 {
        a[last","$0]++
    }

    {
        last=$0
    }

    END {
        for (pair in a)
            print a[pair], pair
    }' file.txt | sort -nr | head -1

答案 1 :(得分:1)

一些简洁的perl:

perl -MList::Util=max,sum0 -slne '
    for $word (m/(\w+)/g) {$count{$word}++}
 } END {
    $pair{$_} = sum0 @count{+split} for ($a, $b);
    $max = max values %pair;
    print "$max => ", {reverse %pair}->{$max};
' -- -a="hi hello" -b="good bye" simple.txt
3 => hi hello