Bash

如何在作為參數傳遞的所有“n”個文件中計算屬於文件的每個單詞的出現次數?

  • November 25, 2018

我正在尋找一個 shell 腳本,它接受文件名列表作為其參數,計算並報告出現在其他參數文件的第一個參數文件中的每個單詞的出現。

我非常確定如何計算一個單詞在一個文件中的出現次數。

那就是使用這個技巧:

$ tr ' ' '\n' < FILE | grep -c WORD

當它到達文件數量時,我被卡住n了。

這是我到目前為止所帶來的:

#!/bin/bash

if [ $# -lt 2 ]
   then
   echo "Very less arguments bro."
fi

search_file=`tr '\n' ' ' < $1` # Make the first file in to a sequence of words.

for other_file in "$@"
do
   if [ $other_file = $1 ]
       then 
       continue
   fi

   # Modify this file such that each space turns in to a newline
   tr ' ' '\n' < $other_file > new_temp_file

   for search_word in $search_file
   do
       word_freq=`grep -c $search_word new_temp_file`
       echo "Word=$search_word Frequency=$word_freq"
   done
done

我會做:

#! /bin/sh -
# usage: wordcount <file-with-words-to-search-for> [<file>...]
words=$(tr -s '[[:space:]]' '[\n*]' < "${1?No word list provided}" | grep .)
[ -n "$words" ] || exit

shift
for file do
 printf 'File: %s\n' "$file"
 tr -s '[[:space:]]' '[\n*]' | grep -Fxe "$words" | sort | uniq -c | sort -rn
done

(僅計算在每個文件中至少找到一次的單詞)。

您可以遍歷命令行上提供的文件列表,如下所示:

for file in "$@"
do
   echo "Considering file ==> $file <=="
done

您匹配單詞的方法應該非常有效。您還可以使用以下方法搜尋出現的單詞grep -o

echo 'I can cry cryogenic tears when I scry my hands. Can you cry too?' |
   grep -o '\bcry\b'    # \b marks a word boundary

將結果導入wc -l將為您提供輸入流中出現的次數。

Using$( ... )允許將命令的輸出插入到另一個使用的文本中。例如

echo "The date and time right now is $(date)"

我們需要一些額外的工作來避免搜尋第一個文件,而是使用它作為單詞列表。但是把這些放在一起,你最終會得到這樣的結果:

wordfile="$1"
wordlist=($(cat "$wordfile"))
shift

for file in "$@"
do
   for word in "${wordlist[@]}"
   do
       # echo "$file: $word:" $(grep -o "\b${word}\b" "$file" | wc -l)  # My way
       echo "$file: $word:" $(tr ' ' '\n' <"$file" | grep -c "$word")   # Your way
   done
done

它的效率不是很高,因為對於 N 個單詞,它會搜尋每個文件 N 次。您可能會發現這grep -f對您有幫助。

引用自:https://unix.stackexchange.com/questions/390910