7

list.txt単語のリストを含むファイルがあります。各単語が別のファイルに何回出現するかを調べてfile1.txt、結果を出力したい。スプレッドシート プログラムを使用して手動で数値を追加できるので、すべての数値の単純な出力で十分list.txtですが、スクリプトが の各行の末尾に数値を追加する場合は、list.txtさらに優れています。たとえば、次のようになります。

bear 3
fish 15

私はこれを試しましたが、うまくいきません:

cat list.txt | grep -c file1.txt
4

4 に答える 4

9

これは、単語リスト ファイルから一度に 1 つの単語を読み取り、データ ファイル内のインスタンスをカウントするループで実行できます。例えば:

while read; do
    echo -n "$REPLY "
    fgrep -ow "$REPLY" data.txt | wc -l
done < <(sort -u word_list.txt)

「秘密のソース」は次のもので構成されています。

  1. 暗黙の REPLY 変数を使用する。
  2. プロセス置換を使用して、単語リスト ファイルから単語を収集します。と
  3. データファイル内の単語全体をgrepしていることを確認してください。
于 2012-05-19T06:01:04.657 に答える
4

この awk メソッドは、各ファイルを一度だけ通過する必要があります。

awk '
  # read the words in list.txt
  NR == FNR {count[$1]=0; next}
  # process file1.txt
  {
    for (i=0; i<=NF; i++) 
      if ($i in count)
        count[$i]++
  }
  # output the results
  END {
    for (word in count)
      print word, count[word]
  }
' list.txt file1.txt
于 2012-05-19T09:44:38.663 に答える
3

これはうまくいくかもしれません(GNU sed):

tr -s ' ' '\n' file1.txt |
sort |
uniq -c |
sed -e '1i\s|.*|& 0|' -e 's/\s*\(\S*\)\s\(\S*\)\s*/s|\\<\2\\>.*|\2 \1|/' |
sed -f - list.txt

説明:

  • 言葉file1.txtに分ける
  • 単語を並べ替える
  • 言葉を数える
  • 単語に一致するスクリプトを作成しsedます (最初は各単語をゼロにします)。
  • 上記のスクリプトをlist.txt
于 2012-05-19T08:26:22.373 に答える
1

単一行コマンド

cat file1.txt |tr " " "\n"|sort|uniq -c |sort -n -r -k 1 |grep -w -f list.txt 

コマンドの最後の部分は、grep にリストから一致する単語を読み取り (-f オプション)、単語全体に一致するように指示します (-w)。つまり、list.txt に car が含まれている場合、grep はキャリッジを無視する必要があります。

ただし、単語全体の見方と grep の見方は異なる場合があることに注意してください。たとえば。car はcarryと一致しませんが、car-wash と一致します。"-" は単語境界として考慮されることに注意してください。grep は、文字、数字、およびアンダースコアを除くすべてを単語境界として使用します。これは、英語で受け入れられている単語の定義に準拠しているため、問題にはなりません。

于 2014-09-11T14:21:38.140 に答える