7

Linux のクックブックを読んでコツをつかみました。私はそれにかなり慣れていません。

テキストのコンコーダンスと呼ばれるトピックに出くわしました。今、私はそれが何であるかを理解していますが、コンコーダンスを生成する tr、sort、および uniq を使用して一連のコマンドを取得することはできません (クックブックにはそう書かれています)。

基本的なコンコーダンスの作成方法を教えてもらえますか? つまり、一意の単語ごとに単語の頻度を並べ替えて表示するだけです。

tr を使用してすべてのスペースを改行文字に変換し、各単語が新しい行に入り、それがソーターに渡され、-c フラグを使用して uniq に渡されてカウントを行うというクックブックで提示されたアイデアユニークな用語。

ただし、正しいパラメーターを把握することはできません。各パラメーターの機能を説明しながら、誰かが説明してもらえますか?

これについてグーグルで調べましたが、私の問題に対する明確に定義された答えを得ることができません。

どんな助けでも大歓迎です!

4

2 に答える 2

1

これを行うには多くの方法がありますが、これが私の解決策です。あなたが言及したものとは異なるコマンドを使用しますがsed、最終的な `sort を使用すると、より望ましい出力が生成される場合があります。

find . -type f -print0 | xargs -0 cat | sed 's/[[:punct:]]//g' | sed -r 's/\s+/\n/g' | sort | uniq -c | sort -n

find . -type f -print0現在のディレクトリからすべてのフォルダーとファイルを再帰的に検索します。-type fファイルのみを返します。-print0特殊\0文字を使用してファイル名を終了し、スペースがパイプ内の次のコマンドを混乱させないようにします。

xargsは入力を受け取り、それをコマンド (この場合は ) の引数に変換しますcatcat引数として与えられたすべてのファイルの内容を出力します。は-0、入力がスペースではなく特殊文字で区切られていることを xargs に伝え\0ます。

sedパターン マッチング ストリーム エディターです。最初のsedコマンドは、パターンをs使用してすべての句読点を置換 ( ) し、句読点を何も置き換えません。[[:punct:]]与えられた各行のそのようなすべてのパターンに一致します ( g)。

2 番目の sed コマンドは、入力文字列 ( ) を介して、行内の 1 つ以上のスペース ( ) のすべてのインスタンス\s+を改行 ( ) に変換します。\ng

sort単語をアルファベット順に整理します。

uniq -c重複の数を数えながら、出力リスト内の隣接する重複を排除します。

sort -nこの出力を数値的にソートし、単語の頻度でソートされた単語のリストを生成します。

sedxargsは非常に強力なコマンドであり、特に組み合わせて使用​​すると効果的です。しかし、別の投稿者が指摘しているように、findほぼ無制限の力も持っています。trは便利ですが、より具体的ですsed

于 2012-03-11T17:06:32.473 に答える
0
tr ' ' '\n' <input | sort | uniq -c

あなたのコメントを正しく理解できれば、ディレクトリ内のすべてのファイルのすべての単語の合計が必要になります。次のようにできます。

find mydir -type f -exec cat {} + | tr ' ' '\n' | sort | uniq -c

findmydir引数に一致するファイルを再帰的に検索します:-type f通常のファイルのみを保持するように指示し (ディレクトリや、まだ心配する必要のない他のいくつかのタイプとは対照的に)、findを実行しcat、すべてのファイル名を引数として指定します。 ; catファイルを連結し、すべての内容を 1 つの大きなファイルであるかのように出力します。trその出力は、 / sort/uniq実際にコンコーダンスを計算するために同じパイプラインを通過します。

于 2012-01-29T21:19:16.963 に答える