Bash
如何在作為參數傳遞的所有“n”個文件中計算屬於文件的每個單詞的出現次數?
我正在尋找一個 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
對您有幫助。