查找文件中 N 个最常用的单词以及如何处理连字符?

查找文件中 N 个最常用的单词以及如何处理连字符?

假设我们有一个包含以下文本的文件:

hello hel-
lo world wor-
ld test test he-
lo words words

如果我们只使用空格作为分隔符,我们就会有

hello: 1
world: 1
wor:1
ld:1
he: 1
hel-: 1
test:2
lo: 2
words: 2

换句话说,我们如何处理使用连字符分隔两行的单词并将其视为一个单词?

答案1

这应该可以做到:

sed ':1;/-$/{N;b1};s/-\n//g;y/ /\n/' file | sort | uniq -c

答案2

Perl 对此很方便:-0777 开关会将整个文件转换为单个字符串

perl -0777 -ne '
   s/-\n//g;                  # join the hyphenated words
   $count{$_}++ for split;    # count all the words
   while (($k,$v) = each %count) {print "$k:$v\n"}
' file
world:2
helo:1
hello:2
words:2
test:2

输出将没有特定的顺序。


还有一个更晦涩难懂的:。 tclsh 不像-e其他语言那样有一个很好的选择,因此单行代码需要更多工作。这样做的优点是保留了文件中单词的顺序。

echo '
    set fh [open [lindex $argv 1] r]
    set data [read -nonewline $fh]
    close $fh
    foreach word [split [string map {"-\n" ""} $data]] {
        dict incr count $word
    }
    dict for {k v} $count {puts "$k:$v"}
' | tclsh -- file
hello:2
world:2
test:2
helo:1
words:2

答案3

使用tr++sed管道datamash

$ tr ' ' '\n' <file | sed '/-/N;s/-\n//' | datamash -s -g1 --output-delimiter=':' count 1
hello:2
helo:1
test:2
words:2
world:2

相关内容