ファイルで最も一般的な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

つまり、ハイフンを使用して2行を区切って1つの単語として扱う単語をどのように処理しますか?

答え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は他の言語のように選択の幅が広くないので、1-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

関連情報