1

さて、テキストのブロックで、任意のファイルで最も頻繁に使用される100個の単語を一覧表示するコマンドを作成する必要があります。私が今持っているもの:

$ alias words='tr " " "\012" <hamlet.txt | sort -n | uniq -c | sort -r | head -n 10'

出力

$ words
     14 the
     14 of
      8 to
      7 and
      5 To
      5 The
      5 And
      5 a
      4 we
      4 that

次の形式で出力する必要があります。

the of to and To The And a we that

((その点で、出力をすべて大文字で印刷するように指示するにはどうすればよいですか?))

また、「単語」を任意のファイルにパイプできるように変更する必要があるため、パイプ内でファイルを指定する代わりに、最初の入力でファイルに名前を付け、残りはパイプで行います。

4

1 に答える 1

1

さて、必ずしも順番にではありませんが、ポイントを1つずつ取得します。


デフォルトでは標準入力から入力を取得するため、ビットwordsを削除するだけで標準入力を使用するように変更できます。次に、特定のファイルを処理する場合は、次を使用します。<hamlet.txttr

cat hamlet.txt | words

また:

words <hamlet.txt

パイプラインの最初の部分を作成することで、大文字の影響を取り除くことができます。

tr '[A-Z]' '[a-z]'

これは、他のことをする前に入力を小文字にします。


最後に、パイプライン全体(上記の提案された変更を含む)を取得し、それをさらにいくつかのコマンドに渡す場合:

| awk '{printf "%s ", $2}END{print ""}'

これにより、各行の2番目の引数(単語)の後にスペースが続き、最後に改行が終了する空の文字列が出力されます。


たとえば、次のスクリプトwords.shは必要なものを提供します。

tr '[A-Z]' '[a-z]' | tr ' ' '\012' | sort -n | uniq -c | sort -r
    | head -n 3 | awk '{printf "%s ", $2}END{print ""}'

(1行で:読みやすくするために分割しました)次のトランスクリプトのように:

pax> echo One Two two Three three three Four four four four | ./words.sh
four three two 

次のエイリアスで同じ目的を達成できます。

alias words="tr '[A-Z]' '[a-z]' | tr ' ' '\012' | sort -n | uniq -c | sort -r
    | head -n 3 | awk '{printf \"%s \", \$2}END{print \"\"}'"

(繰り返しますが、1行です)しかし、物事がこのように複雑になるときは、途方もないエスケープ文字を避けるためだけに、スクリプトを好みます:-)

于 2012-05-19T13:55:02.273 に答える